Commit b6d94429 authored by Steven杜宇's avatar Steven杜宇

Merge branch 'qmas-1130' of http://gitlab.galaxy-immi.com/mobile-group/galaxy-iOS into qmas-1130

parents 369465a5 5124b1c1
This diff is collapsed.
...@@ -13,13 +13,16 @@ import UIKit ...@@ -13,13 +13,16 @@ import UIKit
class YHIncomeRecordViewController: YHBaseViewController { class YHIncomeRecordViewController: YHBaseViewController {
enum TableRow { enum TableRow {
case incomeSummary(_ isEditing: Bool = false, _ isEditEnable: Bool = false) case incomeSummary(_ isEditing: Bool = false, _ isEditEnable: Bool = false)
case incomeItem(_ isEditState: Bool = false, _ company: String, _ money: String, _ timeStr: String) case incomeItem(_ isEditState: Bool = false, _ company: String, _ money: String, _ timeStr: String, _ incomeId: Int)
case totalIncome(_ money: ASAttributedString) case totalIncome(_ money: ASAttributedString)
case consentForHKTravel(_ title: String, _ detail: ASAttributedString, _ question: String, _ isSelectSureBtn: Bool = true) case consentForHKTravel(_ title: String, _ detail: ASAttributedString, _ question: String, _ isSelectSureBtn: Bool = true)
} }
private lazy var datas: [[TableRow]] = [] private lazy var datas: [[TableRow]] = []
private lazy var viewModel = YHIncomeRecordViewModel()
private var incomeModel = YHIncomeRecordCompleteModel()
private lazy var saveButton: UIButton = { private lazy var saveButton: UIButton = {
let button = UIButton(type: .custom) let button = UIButton(type: .custom)
button.titleLabel?.font = UIFont.PFSC_M(ofSize: 15) button.titleLabel?.font = UIFont.PFSC_M(ofSize: 15)
...@@ -76,11 +79,21 @@ class YHIncomeRecordViewController: YHBaseViewController { ...@@ -76,11 +79,21 @@ class YHIncomeRecordViewController: YHBaseViewController {
view.keyboardDismissMode = .onDrag view.keyboardDismissMode = .onDrag
return view return view
}() }()
private let orderId: Int
init(orderId: Int) {
self.orderId = orderId
super.init(nibName: nil, bundle: nil)
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
setupUI() setupUI()
setupData() requestData(isNeedLoading: true)
} }
override func viewWillAppear(_ animated: Bool) { override func viewWillAppear(_ animated: Bool) {
...@@ -96,11 +109,11 @@ class YHIncomeRecordViewController: YHBaseViewController { ...@@ -96,11 +109,11 @@ class YHIncomeRecordViewController: YHBaseViewController {
extension YHIncomeRecordViewController { extension YHIncomeRecordViewController {
@objc private func clickSaveButton() { @objc private func clickSaveButton() {
// updateIncome(.save)
} }
@objc private func clickSubmitButton() { @objc private func clickSubmitButton() {
// updateIncome(.submit)
} }
private func setupUI() { private func setupUI() {
...@@ -145,12 +158,36 @@ extension YHIncomeRecordViewController { ...@@ -145,12 +158,36 @@ extension YHIncomeRecordViewController {
private func setupData() { private func setupData() {
let detail: ASAttributedString = .init(string: "备注:全年收入是指应课税(应纳所得税)的就业或业务收入,包括工资薪金、津贴、股票期权及从其拥有的公司所得的利润。由个人投资所产生的收入不会计算在内。", .font(UIFont.PFSC_R(ofSize: 13)), .foreground(UIColor(hexString: "#8993A2") ?? .gray)) let detail: ASAttributedString = .init(string: "备注:全年收入是指应课税(应纳所得税)的就业或业务收入,包括工资薪金、津贴、股票期权及从其拥有的公司所得的利润。由个人投资所产生的收入不会计算在内。", .font(UIFont.PFSC_R(ofSize: 13)), .foreground(UIColor(hexString: "#8993A2") ?? .gray))
let firstSection: [TableRow] = [.consentForHKTravel("收入情况", detail, "您在前一年,全年收入是否达港币100万元或以上", true)] let firstSection: [TableRow] = [.consentForHKTravel("收入情况", detail, "您在前一年,全年收入是否达港币100万元或以上", incomeModel.income_over_100 == YHIncomeOver100.true.rawValue)]
let totalMoney: ASAttributedString = .init(string: "约 ", .font(.PFSC_R(ofSize: 14))) + .init(string: "1,351,517", .font(UIFont(name: "DINAlternate-Bold", size: 20) ?? UIFont.systemFont(ofSize: 20))) + .init(string: " 港币", .font(.PFSC_R(ofSize: 14))) guard incomeModel.income_over_100 == YHIncomeOver100.true.rawValue else {
let secondSection: [TableRow] = [.incomeSummary(false, false), .incomeItem(false, "华为有限公司", "约1,234,234港币", "已填写"), .incomeItem(false, "腾讯有限公司", "约1,234,234港币", "有5项未填写"), .totalIncome(totalMoney)] datas = [firstSection]
tableView.reloadData()
return
}
let hkdFormatter = currencyFormat("")
var money: Double = 0
var secondSection: [TableRow] = [.incomeSummary(false, false)]
incomeModel.list.forEach { companyModel in
money += companyModel.income_money
let moneyStr = "约" + (hkdFormatter.string(from: NSNumber(value: companyModel.income_money)) ?? "0") + "港币"
let timeStr: String = companyModel.fill_status ? "已填写" : "有\(companyModel.unfilled_count)项未填写"
let incomeItem: TableRow = .incomeItem(false, companyModel.company_name, moneyStr, timeStr, companyModel.income_id)
secondSection.append(incomeItem)
}
let totalNum = hkdFormatter.string(from: NSNumber(value: money)) ?? "0"
let totalMoney: ASAttributedString = .init(string: "约 ", .font(.PFSC_R(ofSize: 14))) + .init(string: totalNum, .font(UIFont(name: "DINAlternate-Bold", size: 20) ?? UIFont.systemFont(ofSize: 20))) + .init(string: " 港币", .font(.PFSC_R(ofSize: 14)))
secondSection.append(.totalIncome(totalMoney))
datas = [firstSection, secondSection] datas = [firstSection, secondSection]
tableView.reloadData() tableView.reloadData()
} }
private func currencyFormat(_ currencySymbol: String) -> NumberFormatter {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.currencySymbol = currencySymbol
formatter.maximumFractionDigits = 0
return formatter
}
} }
extension YHIncomeRecordViewController: UITableViewDelegate, UITableViewDataSource { extension YHIncomeRecordViewController: UITableViewDelegate, UITableViewDataSource {
...@@ -182,7 +219,7 @@ extension YHIncomeRecordViewController: UITableViewDelegate, UITableViewDataSour ...@@ -182,7 +219,7 @@ extension YHIncomeRecordViewController: UITableViewDelegate, UITableViewDataSour
cell.setupCellInfo(isEditState, isEditEnable, showRightButton: false) cell.setupCellInfo(isEditState, isEditEnable, showRightButton: false)
return cell return cell
} }
case let .incomeItem(isEditState, company, money, timeStr): case let .incomeItem(isEditState, company, money, timeStr, _):
if let cell = tableView.dequeueReusableCell(withIdentifier: YHIncomeRecordItemCell.cellReuseIdentifier) as? YHIncomeRecordItemCell { if let cell = tableView.dequeueReusableCell(withIdentifier: YHIncomeRecordItemCell.cellReuseIdentifier) as? YHIncomeRecordItemCell {
cell.setupCellInfo(title: company, detail: money, rightText: timeStr, isEditing: isEditState, showBottomLine: false) cell.setupCellInfo(title: company, detail: money, rightText: timeStr, isEditing: isEditState, showBottomLine: false)
return cell return cell
...@@ -190,16 +227,24 @@ extension YHIncomeRecordViewController: UITableViewDelegate, UITableViewDataSour ...@@ -190,16 +227,24 @@ extension YHIncomeRecordViewController: UITableViewDelegate, UITableViewDataSour
case let .totalIncome(money): case let .totalIncome(money):
if let cell = tableView.dequeueReusableCell(withIdentifier: YHTotalIncomeCell.cellReuseIdentifier) as? YHTotalIncomeCell { if let cell = tableView.dequeueReusableCell(withIdentifier: YHTotalIncomeCell.cellReuseIdentifier) as? YHTotalIncomeCell {
cell.setupCellInfo(detail: money) cell.setupCellInfo(detail: money)
cell.didClickInfoButton = { cell.didClickInfoButton = { [weak self] in
YHHUD.flash(message: "注:按1港币≈0.92人民币计算,实际金额按递交时入境处给出的汇率为准") guard let self = self else {
return
}
let rate = self.incomeModel.rate > 0 ? self.incomeModel.rate : 0.92
YHHUD.flash(message: "注:按1港币≈\(rate)人民币计算,实际金额按递交时入境处给出的汇率为准")
} }
return cell return cell
} }
case let .consentForHKTravel(title, detail, question, isSelectSureBtn): case let .consentForHKTravel(title, detail, question, isSelectSureBtn):
if let cell = tableView.dequeueReusableCell(withIdentifier: YHInfoConsentForHKTravelCell.cellReuseIdentifier) as? YHInfoConsentForHKTravelCell { if let cell = tableView.dequeueReusableCell(withIdentifier: YHInfoConsentForHKTravelCell.cellReuseIdentifier) as? YHInfoConsentForHKTravelCell {
cell.setupCellInfo(title: title, detail: detail, question: question) cell.setupCellInfo(title: title, detail: detail, question: question)
cell.didSelectSureButton = { _ in cell.didSelectSureButton = { [weak self] selected in
// guard let self = self else {
return
}
self.incomeModel.income_over_100 = selected ? YHIncomeOver100.true.rawValue : YHIncomeOver100.false.rawValue
self.setupData()
} }
cell.selectedSureButton = isSelectSureBtn cell.selectedSureButton = isSelectSureBtn
return cell return cell
...@@ -231,9 +276,61 @@ extension YHIncomeRecordViewController: UITableViewDelegate, UITableViewDataSour ...@@ -231,9 +276,61 @@ extension YHIncomeRecordViewController: UITableViewDelegate, UITableViewDataSour
return return
} }
let tableRow = sectionArr[indexPath.row] let tableRow = sectionArr[indexPath.row]
if case .incomeItem = tableRow { if case let .incomeItem(_, _, _, _, incomeId) = tableRow {
let ctl = YHIncomeRecordWorkExperienceViewController() let ctl = YHIncomeRecordWorkExperienceViewController(incomeId: incomeId)
ctl.submitSuccess = { [weak self] in
self?.requestData(isNeedLoading: true)
}
navigationController?.pushViewController(ctl, animated: true) navigationController?.pushViewController(ctl, animated: true)
} }
} }
} }
extension YHIncomeRecordViewController {
private func requestData(isNeedLoading: Bool = false) {
if isNeedLoading {
YHHUD.show(.progress(message: "加载中..."))
}
viewModel.getIncomeList(orderId: orderId) { [weak self] incomeModel, error in
guard let self = self else {
return
}
if isNeedLoading {
YHHUD.hide()
}
guard let incomeModel = incomeModel else {
printLog("YHIncomeRecordViewController: 请求失败")
if let errorMsg = error?.errorMsg, errorMsg.count > 0 {
YHHUD.flash(message: errorMsg)
}
self.datas = []
self.tableView.reloadData()
return
}
self.incomeModel = incomeModel
self.setupData()
}
}
private func updateIncome(_ type: YHIncomeRecordUpdateType) {
let incomeOver100: YHIncomeOver100 = YHIncomeOver100(rawValue: incomeModel.income_over_100) ?? .true
let msg = type == .save ? "保存中..." : "提交中..."
YHHUD.show(.progress(message: msg))
viewModel.incomeUpdate(orderId: orderId, incomeOver100: incomeOver100, type: type) { [weak self] success, error in
guard let self = self else {
return
}
YHHUD.hide()
if success {
let msg = type == .save ? "保存成功" : "提交成功"
YHHUD.flash(message: msg)
if type == .submit {
self.navigationController?.popViewController(animated: true)
}
} else if let errorMsg = error?.errorMsg, errorMsg.count > 0 {
YHHUD.flash(message: errorMsg)
}
}
}
}
...@@ -66,23 +66,15 @@ class YHIncomeTypeSelectViewController: YHBaseViewController { ...@@ -66,23 +66,15 @@ class YHIncomeTypeSelectViewController: YHBaseViewController {
}() }()
private lazy var datas: [YHIncomeTypeSelectModel] = { private lazy var datas: [YHIncomeTypeSelectModel] = {
["工资薪金所得及全年一次性奖金", YHIncomeType.allCases.map {
"上市公司股票期权或股权收入", YHIncomeTypeSelectModel(type: $0, isSelected: false)
"持股公司分红收入",
"个体工商户/合伙企业/独资企业经营所得收入",
"股权转让收入",
"内地公司收入(持股50%及以上)",
"香港公司收入(持股50%及以上)",
"澳门公司收入(持股50%及以上)",
"其他境外公司收入(持股50%及以上)"].map {
YHIncomeTypeSelectModel(title: $0, isSelected: false)
} }
}() }()
var sureButtonEvent: (([String]) -> Void)? var sureButtonEvent: (([YHIncomeType]) -> Void)?
private var selectedTypes: [String] = [] private var selectedTypes: [YHIncomeType] = []
init(selectedTypes: [String]) { init(selectedTypes: [YHIncomeType]) {
self.selectedTypes = selectedTypes self.selectedTypes = selectedTypes
super.init(nibName: nil, bundle: nil) super.init(nibName: nil, bundle: nil)
} }
...@@ -98,7 +90,7 @@ class YHIncomeTypeSelectViewController: YHBaseViewController { ...@@ -98,7 +90,7 @@ class YHIncomeTypeSelectViewController: YHBaseViewController {
} }
@objc private func clickSureButton() { @objc private func clickSureButton() {
sureButtonEvent?(selectedTypes) sureButtonEvent?(selectedTypes.sorted(by: { $0.rawValue < $1.rawValue }))
dismiss(animated: true) dismiss(animated: true)
} }
...@@ -162,7 +154,7 @@ class YHIncomeTypeSelectViewController: YHBaseViewController { ...@@ -162,7 +154,7 @@ class YHIncomeTypeSelectViewController: YHBaseViewController {
guard let self = self else { guard let self = self else {
return return
} }
if self.selectedTypes.contains(model.title) { if self.selectedTypes.contains(model.type) {
model.isSelected = true model.isSelected = true
} }
} }
...@@ -187,7 +179,7 @@ extension YHIncomeTypeSelectViewController: UITableViewDelegate, UITableViewData ...@@ -187,7 +179,7 @@ extension YHIncomeTypeSelectViewController: UITableViewDelegate, UITableViewData
} }
let model = datas[indexPath.section] let model = datas[indexPath.section]
if let cell = tableView.dequeueReusableCell(withIdentifier: YHIncomeTypePopViewSelectCell.cellReuseIdentifier) as? YHIncomeTypePopViewSelectCell { if let cell = tableView.dequeueReusableCell(withIdentifier: YHIncomeTypePopViewSelectCell.cellReuseIdentifier) as? YHIncomeTypePopViewSelectCell {
cell.setupCellInfo(title: model.title, isSelected: model.isSelected) cell.setupCellInfo(title: model.type.nameString(), isSelected: model.isSelected)
return cell return cell
} }
return UITableViewCell() return UITableViewCell()
...@@ -221,12 +213,12 @@ extension YHIncomeTypeSelectViewController: UITableViewDelegate, UITableViewData ...@@ -221,12 +213,12 @@ extension YHIncomeTypeSelectViewController: UITableViewDelegate, UITableViewData
let model = datas[indexPath.section] let model = datas[indexPath.section]
model.isSelected.toggle() model.isSelected.toggle()
if model.isSelected { if model.isSelected {
if !selectedTypes.contains(model.title) { if !selectedTypes.contains(model.type) {
selectedTypes.append(model.title) selectedTypes.append(model.type)
} }
} else { } else {
if let index = selectedTypes.firstIndex(where: { title in if let index = selectedTypes.firstIndex(where: { type in
title == model.title type == model.type
}) { }) {
selectedTypes.remove(at: index) selectedTypes.remove(at: index)
} }
......
//
// YHIncomeCompanyDetailModel.swift
// galaxy
//
// Created by alexzzw on 2024/11/18.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import Foundation
import SmartCodable
class YHIncomeCompanyDetailModel: SmartCodable {
var company_name: String = ""
var income_money: Double = 0
var corporate_turnover: Double = 0
var income_type: [Int] = []
var template_id: [Int] = []
var has_all_file: Int = 0
var rate: Double = 0
required init() {
}
}
//
// YHIncomeRecordCompleteModel.swift
// galaxy
//
// Created by alexzzw on 2024/11/18.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import Foundation
import SmartCodable
class YHIncomeRecordCompleteModel: SmartCodable {
var income_over_100: Int = -1
var rate: Double = 0
var list: [YHIncomeRecordListModel] = []
required init() {
}
}
class YHIncomeRecordListModel: SmartCodable {
var income_id: Int = 0
var company_name: String = ""
var income_money: Double = 0
var fill_status: Bool = false
var unfilled_count: Int = 0
required init() {
}
}
//
// YHIncomeRecordUtilType.swift
// galaxy
//
// Created by alexzzw on 2024/11/18.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
enum YHIncomeRecordHasAllFile: Int {
case unknown = 0
case `true` = 1
case `false` = 2
}
enum YHIncomeOver100: Int {
case `true` = 1
case `false` = 2
}
enum YHIncomeRecordUpdateType: Int {
case save = 1
case submit = 2
}
//
// YHIncomeType.swift
// galaxy
//
// Created by alexzzw on 2024/11/18.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import Foundation
enum YHIncomeType: Int, CaseIterable {
case incomeOfMainland = 1
case incomeOfHKCompanies = 2
case incomeOfMacauCompanies = 3
case stockOrEquityIncome = 4
case salaryIncomeAndBonus = 5
case dividendIncome = 6
case equityTransferIncome = 7
case businessIncome = 8
case incomeOfOtherOverseasCompanies = 9
static func defaultDocs() -> [String] {
return ["纳税记录",
"纳税清单",
"工作证明"]
}
func nameString() -> String {
switch self {
case .incomeOfMainland:
return "内地公司收入(持股50%及以上)"
case .incomeOfHKCompanies:
return "香港公司收入(持股50%及以上)"
case .incomeOfMacauCompanies:
return "澳门公司收入(持股50%及以上)"
case .stockOrEquityIncome:
return "上市公司股票期权或股权收入"
case .salaryIncomeAndBonus:
return "工资薪金所得及全年一次性奖金"
case .dividendIncome:
return "持股公司分红收入"
case .equityTransferIncome:
return "股权转让收入"
case .businessIncome:
return "个体工商户/合伙企业/独资企业经营所得收入"
case .incomeOfOtherOverseasCompanies:
return "其他境外公司收入(持股50%及以上"
}
}
func docsArray() -> [String] {
switch self {
case .incomeOfMainland:
return ["验资报告",
"审计报告",
"绝对实益拥有人声明书",
"企业所得税月(季)度预缴纳税申报表(A类)(前4个季度/前12个月)",
"企业所得税完税证明(表格式)",
"企业所得税年度纳税申报表(A类)(近一年度)"]
case .incomeOfHKCompanies:
return ["周年申报表",
"审计报告",
"利得税申请表",
"利得税缴纳通知书",
"缴税凭证",
"绝对实益拥有人声明书",
"工作签证",
"工作证明"]
case .incomeOfMacauCompanies:
return ["商业登记证明",
"审计报告",
"所得补充税B组──收益申报书(M1)",
"所得补充税—收益评定通知书(M5)",
"缴税凭证",
"绝对实益拥有人声明书",
"工作签证",
"工作证明"]
case .stockOrEquityIncome:
return ["纳税记录",
"纳税清单",
"股票或期权的发放证明(能看到个人的发放股数和每股价值)",
"工作证明"]
case .salaryIncomeAndBonus:
return ["纳税记录",
"纳税清单",
"工作证明"]
case .dividendIncome:
return ["纳税记录",
"纳税清单",
"持股证明",
"股东分红决议",
"分红入账记录(银行回单)",
"工作证明(持股公司开具)"]
case .equityTransferIncome:
return ["纳税记录",
"纳税清单",
"股权转让相关入账记录(银行回单)",
"股权转让协议",
"股权交割证明&股权变更登记表(显示公司股权占比更改)",
"完税证明(表格式)",
"工作证明"]
case .businessIncome:
return ["纳税记录",
"纳税清单",
"个人所得税经营所得纳税申报表(A表)(前4个季度/前12个月)",
"个人所得税经营所得纳税申报表(A表&B表)(最新年度)",
"个人所得税经营所得纳税申报表(C表)",
"工作证明"]
case .incomeOfOtherOverseasCompanies:
return ["财务报表",
"合法纳税及完税证明",
"公司所有权官方证明文件"]
}
}
}
...@@ -9,11 +9,11 @@ ...@@ -9,11 +9,11 @@
import UIKit import UIKit
class YHIncomeTypeSelectModel: NSObject { class YHIncomeTypeSelectModel: NSObject {
var title: String = ""
var isSelected: Bool = false var isSelected: Bool = false
var type: YHIncomeType = .businessIncome
init(title: String, isSelected: Bool) { init(type: YHIncomeType, isSelected: Bool) {
self.title = title self.type = type
self.isSelected = isSelected self.isSelected = isSelected
} }
......
...@@ -50,7 +50,8 @@ class YHIncomeRecordSummaryCell: YHResignDocumentCell { ...@@ -50,7 +50,8 @@ class YHIncomeRecordSummaryCell: YHResignDocumentCell {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
func setupCellInfo(_ isEditing: Bool, _ isEditEnable: Bool, showRightButton: Bool) { func setupCellInfo(_ isEditing: Bool, _ isEditEnable: Bool, showRightButton: Bool, showBottomLine: Bool = true) {
bottomLineView.isHidden = !showBottomLine
rightButton.isHidden = !showRightButton rightButton.isHidden = !showRightButton
rightButton.isEnabled = isEditEnable rightButton.isEnabled = isEditEnable
updateRightButtonState(isEditing) updateRightButtonState(isEditing)
...@@ -100,8 +101,8 @@ extension YHIncomeRecordSummaryCell { ...@@ -100,8 +101,8 @@ extension YHIncomeRecordSummaryCell {
bottomLineView.snp.makeConstraints { make in bottomLineView.snp.makeConstraints { make in
make.bottom.equalToSuperview() make.bottom.equalToSuperview()
make.left.equalToSuperview().offset(18) make.left.equalToSuperview()
make.right.equalToSuperview().offset(-18) make.right.equalToSuperview()
make.height.equalTo(0.5) make.height.equalTo(0.5)
make.top.equalTo(infoDetailLabel.snp.bottom).offset(16) make.top.equalTo(infoDetailLabel.snp.bottom).offset(16)
} }
......
...@@ -51,6 +51,8 @@ class YHIncomeTypesCell: YHResignDocumentCell { ...@@ -51,6 +51,8 @@ class YHIncomeTypesCell: YHResignDocumentCell {
return return
} }
let typeView = YHIncomeTypeView() let typeView = YHIncomeTypeView()
typeView.clipsToBounds = true
typeView.layer.cornerRadius = 3
typeView.setupInfo(title) typeView.setupInfo(title)
typeView.closeButtonEvent = { [weak self] in typeView.closeButtonEvent = { [weak self] in
guard let self = self else { guard let self = self else {
......
...@@ -95,7 +95,8 @@ class YHInfoConsentForHKTravelCell: YHResignDocumentCell { ...@@ -95,7 +95,8 @@ class YHInfoConsentForHKTravelCell: YHResignDocumentCell {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
func setupCellInfo(title: String, detail: ASAttributedString, question: String) { func setupCellInfo(title: String, detail: ASAttributedString, question: String, showBottomLine: Bool = false) {
bottomLineView.isHidden = !showBottomLine
infoTitleLabel.text = title infoTitleLabel.text = title
infoDetailLabel.attributed.text = detail infoDetailLabel.attributed.text = detail
infoQuestionLabel.text = question infoQuestionLabel.text = question
......
//
// YHIncomeRecordViewModel.swift
// galaxy
//
// Created by alexzzw on 2024/11/18.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHIncomeRecordViewModel: YHBaseViewModel {
func getIncomeList(orderId: Int, callback: @escaping (_ incomeModel: YHIncomeRecordCompleteModel?, _ error: YHErrorModel?) -> Void) {
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.IncomeRecord.incomeList
_ = YHNetRequest.getRequest(url: strUrl, params: ["order_id": orderId]) { json, _ in
// 1. json字符串 转 对象
printLog("model 是 ==> \(json)")
if json.code == 200 {
guard let dic = json.data?.peel as? [String: Any], let resultModel = YHIncomeRecordCompleteModel.deserialize(from: dic) else {
let err = YHErrorModel(errorCode: YHErrorCode.dictParseError.rawValue, errorMsg: YHErrorCode.dictParseError.description())
callback(nil, err)
return
}
callback(resultModel, nil)
} else {
let err = YHErrorModel(errorCode: Int32(json.code), errorMsg: json.msg.isEmpty ? "" : json.msg)
callback(nil, err)
}
} failBlock: { err in
callback(nil, err)
}
}
func getIncomeDetail(incomeId: Int, callback: @escaping (_ companyDetail: YHIncomeCompanyDetailModel?, _ error: YHErrorModel?) -> Void) {
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.IncomeRecord.incomeDetail
_ = YHNetRequest.getRequest(url: strUrl, params: ["income_id": incomeId]) { json, _ in
// 1. json字符串 转 对象
printLog("model 是 ==> \(json)")
if json.code == 200 {
guard let dic = json.data?.peel as? [String: Any], let resultModel = YHIncomeCompanyDetailModel.deserialize(from: dic) else {
let err = YHErrorModel(errorCode: YHErrorCode.dictParseError.rawValue, errorMsg: YHErrorCode.dictParseError.description())
callback(nil, err)
return
}
callback(resultModel, nil)
} else {
let err = YHErrorModel(errorCode: Int32(json.code), errorMsg: json.msg.isEmpty ? "" : json.msg)
callback(nil, err)
}
} failBlock: { err in
callback(nil, err)
}
}
func updateDetail(incomeId: Int, incomeMoney: Double, corporateTurnover: Double, incomeType: [Int], hasAllFile: YHIncomeRecordHasAllFile, callBackBlock: @escaping (_ success: Bool, _ error: YHErrorModel?) -> Void) {
let params: [String: Any] = ["income_id": incomeId,
"income_money": incomeMoney,
"corporate_turnover": corporateTurnover,
"income_type": incomeType,
"has_all_file": hasAllFile.rawValue]
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.IncomeRecord.updateDetail
_ = YHNetRequest.postRequest(url: strUrl, params: params) { json, _ in
// 1. json字符串 转 对象
printLog("model 是 ==> \(json)")
if json.code == 200 {
callBackBlock(true, nil)
} else {
let err = YHErrorModel(errorCode: Int32(json.code), errorMsg: json.msg.isEmpty ? "" : json.msg)
callBackBlock(false, err)
}
} failBlock: { err in
callBackBlock(false, err)
}
}
func incomeUpdate(orderId: Int, incomeOver100: YHIncomeOver100, type: YHIncomeRecordUpdateType, callBackBlock: @escaping (_ success: Bool, _ error: YHErrorModel?) -> Void) {
let params: [String: Any] = ["order_id": orderId,
"income_over_100": incomeOver100.rawValue,
"type": type.rawValue]
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.IncomeRecord.incomeUpdate
_ = YHNetRequest.postRequest(url: strUrl, params: params) { json, _ in
// 1. json字符串 转 对象
printLog("model 是 ==> \(json)")
if json.code == 200 {
callBackBlock(true, nil)
} else {
let err = YHErrorModel(errorCode: Int32(json.code), errorMsg: json.msg.isEmpty ? "" : json.msg)
callBackBlock(false, err)
}
} failBlock: { err in
callBackBlock(false, err)
}
}
}
...@@ -60,10 +60,6 @@ class YHImageResultViewController: YHBaseViewController { ...@@ -60,10 +60,6 @@ class YHImageResultViewController: YHBaseViewController {
if controller.isKind(of: YHWorkExperienceViewController.self) { if controller.isKind(of: YHWorkExperienceViewController.self) {
targetVC = controller targetVC = controller
} }
if controller.isKind(of: YHWorkIntroductionViewController.self) {
targetVC = controller
}
} }
if let targetVC = targetVC { if let targetVC = targetVC {
self.navigationController?.popToViewController(targetVC, animated: true) self.navigationController?.popToViewController(targetVC, animated: true)
......
...@@ -113,12 +113,17 @@ class YHWorkExperienceListViewController: YHBaseViewController { ...@@ -113,12 +113,17 @@ class YHWorkExperienceListViewController: YHBaseViewController {
return return
} }
} }
viewModel?.requestWorkTimeRemarkWorkExperience("\(orderId)", callBackBlock: {[weak self] success, error in
guard let self = self else { return }
})
viewModel?.requestSaveAllWorkExperience("\(orderId)", callBackBlock: {[weak self] success, error in viewModel?.requestSaveAllWorkExperience("\(orderId)", callBackBlock: {[weak self] success, error in
guard let self = self else { return } guard let self = self else { return }
if success ?? false { if success ?? false {
self.navigationController?.popViewController(animated: true) self.navigationController?.popViewController(animated: true)
} }
}) })
} }
func showDeleteAlert(_ model: YHWorkItemListModel) { func showDeleteAlert(_ model: YHWorkItemListModel) {
...@@ -188,6 +193,15 @@ extension YHWorkExperienceListViewController: UITableViewDelegate, UITableViewDa ...@@ -188,6 +193,15 @@ extension YHWorkExperienceListViewController: UITableViewDelegate, UITableViewDa
return cell return cell
} else if indexPath.row == 2 { } else if indexPath.row == 2 {
let cell = tableView.dequeueReusableCell(withClass: YHWorkExperienceListReasonTableViewCell.self) let cell = tableView.dequeueReusableCell(withClass: YHWorkExperienceListReasonTableViewCell.self)
cell.model = viewModel?.mainModel
cell.clickBlock = { [weak self] value, index in
guard let self = self else { return }
if index == 0 {
self.viewModel?.mainModel.work_time_empty_remark = value
} else {
self.viewModel?.mainModel.work_time_overlap_remark = value
}
}
cell.backgroundColor = .clear cell.backgroundColor = .clear
cell.contentView.backgroundColor = .clear cell.contentView.backgroundColor = .clear
return cell return cell
......
...@@ -25,6 +25,7 @@ class YHWorkExperienceViewController: YHBaseViewController { ...@@ -25,6 +25,7 @@ class YHWorkExperienceViewController: YHBaseViewController {
var isShowMessageSelect: Bool = true var isShowMessageSelect: Bool = true
var isKeyboardShow: Bool = false var isKeyboardShow: Bool = false
var selectEditItem = YHWorkExperienceFileModel() var selectEditItem = YHWorkExperienceFileModel()
var fileMessageArray: [String] = ["签字盖章的推荐信", "盖章的工作证明+签字的推荐信", "其他证明(退工单或合同+社保等证明)", "以上均不能提供"]
var renameInputView: YHFileRenameInputView = { var renameInputView: YHFileRenameInputView = {
let view = YHFileRenameInputView.inputView(defalutText: "请输入名称") let view = YHFileRenameInputView.inputView(defalutText: "请输入名称")
return view return view
...@@ -103,13 +104,13 @@ class YHWorkExperienceViewController: YHBaseViewController { ...@@ -103,13 +104,13 @@ class YHWorkExperienceViewController: YHBaseViewController {
viewModel.requestWorkExample { success, error in viewModel.requestWorkExample { success, error in
} }
viewModel.requestWorkDetail(workExperienceID ?? "") {[weak self] success, error in viewModel.requestWorkDetail("\(orderID)", workExperienceID ?? "") {[weak self] success, error in
guard let self = self else { return } guard let self = self else { return }
self.stepView.currentIndex = self.viewModel.mainModel.step self.stepView.currentIndex = self.viewModel.mainModel.step
self.stepView.maxIndex = self.viewModel.mainModel.step self.stepView.maxIndex = self.viewModel.mainModel.step
self.updateDataSource() self.updateDataSource()
self.stepView.dataSource = ["基本信息", "工作职责", "工作亮点", "简历/工作总结"] self.stepView.dataSource = ["基本信息", "工作职责", "工作亮点", "简历/工作总结"]
self.viewModel.requestWorkInfoProject("\(self.viewModel.mainModel.id )") {[weak self] success, error in self.viewModel.requestWorkInfoProject("\(self.viewModel.mainModel.word_id)") {[weak self] success, error in
guard let self = self else { return } guard let self = self else { return }
self.introductionDataSource = success self.introductionDataSource = success
self.fileDataSource = self.viewModel.mainModel.file self.fileDataSource = self.viewModel.mainModel.file
...@@ -162,6 +163,9 @@ class YHWorkExperienceViewController: YHBaseViewController { ...@@ -162,6 +163,9 @@ class YHWorkExperienceViewController: YHBaseViewController {
self.getTextWithType(type: 3)] self.getTextWithType(type: 3)]
} }
func getSelectCompany() -> Int {
return fileMessageArray.firstIndex(where: {$0 == viewModel.mainModel.work_certificate}) ?? 5
}
func setView() { func setView() {
stepView = { stepView = {
...@@ -673,21 +677,20 @@ extension YHWorkExperienceViewController: UITableViewDelegate, UITableViewDataSo ...@@ -673,21 +677,20 @@ extension YHWorkExperienceViewController: UITableViewDelegate, UITableViewDataSo
} else { } else {
if indexPath.row == 0 { if indexPath.row == 0 {
let cell = tableView.dequeueReusableCell(withClass: YHWorkExperienceTableViewCell.self) let cell = tableView.dequeueReusableCell(withClass: YHWorkExperienceTableViewCell.self)
cell.country = self.viewModel.mainModel.location.country
cell.selectDataSource = getTipsWithType() cell.selectDataSource = getTipsWithType()
cell.selectItem = getSelectCompany()
cell.dataSource = baseDataSource?[indexPath.row] cell.dataSource = baseDataSource?[indexPath.row]
cell.workExperienceBlock = {[weak self] model in cell.workExperienceBlock = {[weak self] model in
guard let self = self else { return } guard let self = self else { return }
self.viewModel.updateModel(model) self.viewModel.updateModel(model)
let id = model.id let id = model.id
if id != .id1 && id != .id3 && id != .id4 && id != .id7 && id != .id8 && id != .id12 && id != .id14 && id != .id16 && id != .id17 && id != .id18 { if id != .id1 {
self.updateDataSource() self.updateDataSource()
} }
} }
cell.companyBlock = {[weak self] company in cell.selectBlock = {[weak self] index in
guard let self = self else { return } guard let self = self else { return }
self.viewModel.updateModel(company) self.viewModel.mainModel.work_certificate = fileMessageArray[index.first ?? 0]
self.updateDataSource()
} }
return cell return cell
} else { } else {
......
...@@ -10,9 +10,12 @@ import Foundation ...@@ -10,9 +10,12 @@ import Foundation
import SmartCodable import SmartCodable
class YHWorkExperienceDetailModel: SmartCodable { class YHWorkExperienceDetailModel: SmartCodable {
var id: Int = 0 var word_id: Int = 0
var order_id: Int = 0 var order_id: Int = 0
var company_name: String = "" var company_name: String = ""
var professional_level: Int = 0
var work_certificate: String = ""
var is_famous_enterprise: Int = 0 var is_famous_enterprise: Int = 0
var duty: String = "" var duty: String = ""
var entry_time: String = "" var entry_time: String = ""
...@@ -20,7 +23,6 @@ class YHWorkExperienceDetailModel: SmartCodable { ...@@ -20,7 +23,6 @@ class YHWorkExperienceDetailModel: SmartCodable {
var industry: String = "" var industry: String = ""
var location: YHAddressModel = YHAddressModel() var location: YHAddressModel = YHAddressModel()
var location_aboard: Int = 0 var location_aboard: Int = 0
var professional_level: Int = 0
var professional_other: String = "" var professional_other: String = ""
var position: String = "" var position: String = ""
var remark: String = "" var remark: String = ""
...@@ -32,7 +34,6 @@ class YHWorkExperienceDetailModel: SmartCodable { ...@@ -32,7 +34,6 @@ class YHWorkExperienceDetailModel: SmartCodable {
var operator_name: String = "" var operator_name: String = ""
var operator_english_name: String = "" var operator_english_name: String = ""
var operator_id: Int = 0 var operator_id: Int = 0
var work_certificate: String = ""
var executives_certificate: String = "" var executives_certificate: String = ""
var is_executives: Int = 0 var is_executives: Int = 0
var wduty: String = "" var wduty: String = ""
......
...@@ -19,6 +19,7 @@ enum YHWorkExperienceSelectType: Int { ...@@ -19,6 +19,7 @@ enum YHWorkExperienceSelectType: Int {
case structure = 7 case structure = 7
case level = 8 case level = 8
case prove = 9 case prove = 9
case company = 10
} }
enum YHWorkExperienceID: Int { enum YHWorkExperienceID: Int {
......
//
// YHWorkExperiencePositionModel.swift
// galaxy
//
// Created by EDY on 2024/11/18.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import SmartCodable
class YHWorkExperiencePositionModel: SmartCodable {
var position_id: Int = 0
var order_id: Int = 0
var work_id: Int = 0
var position_name: String = ""
var wduty: String = ""
var entry_time: String = ""
var departure_time: String = ""
var experience_scope: String = ""
var experience_sub_scope: String = ""
var is_international_work_experience: Int = 0
var provide_certificate_type: Int = 0
var work_country: String?
var work_city: String?
required init() {
}
}
...@@ -11,6 +11,8 @@ import SmartCodable ...@@ -11,6 +11,8 @@ import SmartCodable
class YHWorkModel: SmartCodable { class YHWorkModel: SmartCodable {
var count: Int? var count: Int?
var work_time_overlap_remark: String = "" //重叠期
var work_time_empty_remark: String = "" //空窗期
var list: [YHWorkItemListModel]? var list: [YHWorkItemListModel]?
required init() { required init() {
} }
......
...@@ -247,6 +247,8 @@ class YHWorkExperienceItemView: UIView { ...@@ -247,6 +247,8 @@ class YHWorkExperienceItemView: UIView {
} }
case .prove: case .prove:
break break
case .company:
break
} }
} }
nextStepImageView.isHidden = false nextStepImageView.isHidden = false
...@@ -500,6 +502,10 @@ class YHWorkExperienceItemView: UIView { ...@@ -500,6 +502,10 @@ class YHWorkExperienceItemView: UIView {
block(self.dataSource ?? YHWorkExperienceModel()) block(self.dataSource ?? YHWorkExperienceModel())
} }
} }
case .company:
YHWorkExperienceCompanySelectView.show { array in
}
} }
} }
} }
......
...@@ -10,6 +10,8 @@ import UIKit ...@@ -10,6 +10,8 @@ import UIKit
import AttributedString import AttributedString
class YHWorkExperienceListReasonTableViewCell: UITableViewCell { class YHWorkExperienceListReasonTableViewCell: UITableViewCell {
typealias ExperienceListBlock = (_ value: String, _ index: Int) -> ()
var clickBlock: ExperienceListBlock?
var centerView: UIView! var centerView: UIView!
var titleLabel: UILabel! var titleLabel: UILabel!
var lineView: UIView! var lineView: UIView!
...@@ -24,6 +26,20 @@ class YHWorkExperienceListReasonTableViewCell: UITableViewCell { ...@@ -24,6 +26,20 @@ class YHWorkExperienceListReasonTableViewCell: UITableViewCell {
var promptsTwoLabel: UILabel! var promptsTwoLabel: UILabel!
var messageTwoNumberLabel: UILabel! var messageTwoNumberLabel: UILabel!
var model: YHWorkModel? {
didSet {
messageTextField.text = model?.work_time_empty_remark
if messageTextField.text.count != 0 {
promptsLabel.isHidden = true
messageNumberLabel.text = "\(messageTextField.text.count)/1000"
}
messageTwoTextField.text = model?.work_time_overlap_remark
if messageTwoTextField.text.count != 0 {
promptsTwoLabel.isHidden = true
messageTwoNumberLabel.text = "\(messageTwoTextField.text.count)/1000"
}
}
}
override func awakeFromNib() { override func awakeFromNib() {
super.awakeFromNib() super.awakeFromNib()
// Initialization code // Initialization code
...@@ -248,24 +264,32 @@ class YHWorkExperienceListReasonTableViewCell: UITableViewCell { ...@@ -248,24 +264,32 @@ class YHWorkExperienceListReasonTableViewCell: UITableViewCell {
extension YHWorkExperienceListReasonTableViewCell: UITextViewDelegate { extension YHWorkExperienceListReasonTableViewCell: UITextViewDelegate {
func textViewDidChange(_ textView: UITextView) { func textViewDidChange(_ textView: UITextView) {
let number = textView.text.count let number = textView.text.count
var numberIndex = 0
if textView.text.count != 0 { if textView.text.count != 0 {
if textView == messageTextField { if textView == messageTextField {
promptsLabel.isHidden = true promptsLabel.isHidden = true
messageNumberLabel.text = "\(number)/1000" messageNumberLabel.text = "\(number)/1000"
numberIndex = 0
} else { } else {
promptsTwoLabel.isHidden = true promptsTwoLabel.isHidden = true
messageTwoNumberLabel.text = "\(number)/1000" messageTwoNumberLabel.text = "\(number)/1000"
numberIndex = 1
} }
} else { } else {
if textView == messageTextField { if textView == messageTextField {
promptsLabel.isHidden = false promptsLabel.isHidden = false
messageNumberLabel.text = "\(number)/1000" messageNumberLabel.text = "\(number)/1000"
numberIndex = 0
} else { } else {
promptsTwoLabel.isHidden = false promptsTwoLabel.isHidden = false
messageTwoNumberLabel.text = "\(number)/1000" messageTwoNumberLabel.text = "\(number)/1000"
numberIndex = 1
} }
} }
if let block = clickBlock {
block(textView.text, numberIndex)
}
} }
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
......
...@@ -69,7 +69,7 @@ class YHWorkExperiencePositionTableViewCell: UITableViewCell { ...@@ -69,7 +69,7 @@ class YHWorkExperiencePositionTableViewCell: UITableViewCell {
titleLabel = { titleLabel = {
let label = UILabel() let label = UILabel()
label.font = UIFont.PFSC_M(ofSize: 17) label.font = UIFont.PFSC_M(ofSize: 17)
label.text = "主申请人工作经历" label.text = "职位信息"
label.textColor = UIColor.mainTextColor label.textColor = UIColor.mainTextColor
return label return label
}() }()
...@@ -84,7 +84,7 @@ class YHWorkExperiencePositionTableViewCell: UITableViewCell { ...@@ -84,7 +84,7 @@ class YHWorkExperiencePositionTableViewCell: UITableViewCell {
subTitleLabel = { subTitleLabel = {
let label = UILabel() let label = UILabel()
label.font = UIFont.PFSC_R(ofSize: 12) label.font = UIFont.PFSC_R(ofSize: 12)
label.text = "(从最近一份全职工作开始,直至毕业后的第一份工作)" label.text = "(从该公司第一个职位开始, 直至最后一个职位)"
label.textColor = UIColor.labelTextColor2 label.textColor = UIColor.labelTextColor2
return label return label
}() }()
......
...@@ -90,6 +90,13 @@ class YHWorkExperienceSelectView: UIView { ...@@ -90,6 +90,13 @@ class YHWorkExperienceSelectView: UIView {
view.layer.borderColor = UIColor.brandMainColor.cgColor view.layer.borderColor = UIColor.brandMainColor.cgColor
view.addTarget(self, action: #selector(agreeClick(sender:)), for: .touchUpInside) view.addTarget(self, action: #selector(agreeClick(sender:)), for: .touchUpInside)
view.tag = 20000 + i view.tag = 20000 + i
if selectItem.contains(i) {
view.layer.borderWidth = 1
view.backgroundColor = UIColor(hex: 0xebf0f9)
} else {
view.layer.borderWidth = 0
view.backgroundColor = UIColor.contentBkgColor
}
return view return view
}() }()
mainItemView.addSubview(bgviewButton) mainItemView.addSubview(bgviewButton)
...@@ -145,21 +152,25 @@ class YHWorkExperienceSelectView: UIView { ...@@ -145,21 +152,25 @@ class YHWorkExperienceSelectView: UIView {
} }
@objc func agreeClick(sender: UIButton) { @objc func agreeClick(sender: UIButton) {
selectItem.removeAll()
selectItem.append(sender.tag - 20000)
sender.isSelected = !sender.isSelected sender.isSelected = !sender.isSelected
if sender.isSelected { for i in 0..<(dataSource?.count ?? 0) {
sender.layer.borderWidth = 1 if i == sender.tag - 20000 {
sender.backgroundColor = UIColor(hex: 0xebf0f9) let view = mainItemView.viewWithTag(i + 20000)
selectItem.append(sender.tag - 20000) view?.layer.borderWidth = 1
let view = mainItemView.viewWithTag(sender.tag - 20000 + 10000) as! UIImageView view?.backgroundColor = UIColor(hex: 0xebf0f9)
view.image = UIImage(named: "login_privacy_agree") let subview = mainItemView.viewWithTag(i + 10000) as! UIImageView
} else { subview.image = UIImage(named: "login_privacy_agree")
sender.layer.borderWidth = 0 } else {
sender.backgroundColor = UIColor.contentBkgColor let view = mainItemView.viewWithTag(i + 20000)
selectItem.removeAll(where: {$0 == sender.tag - 20000}) view?.layer.borderWidth = 0
let view = mainItemView.viewWithTag(sender.tag - 20000 + 10000) as! UIImageView view?.backgroundColor = UIColor.contentBkgColor
view.image = UIImage(named: "login_privacy_disagree_glay") let subview = mainItemView.viewWithTag(i + 10000) as! UIImageView
subview.image = UIImage(named: "login_privacy_disagree_glay")
}
} }
if let block = selectBlock { if let block = selectBlock {
block(selectItem) block(selectItem)
} }
......
...@@ -12,12 +12,14 @@ import AttributedString ...@@ -12,12 +12,14 @@ import AttributedString
class YHWorkExperienceTableViewCell: UITableViewCell { class YHWorkExperienceTableViewCell: UITableViewCell {
typealias WorkExperienceBlock = (_ model: YHWorkExperienceModel) -> () typealias WorkExperienceBlock = (_ model: YHWorkExperienceModel) -> ()
typealias CompanyBlock = (_ model: YHCompanyModelListModel) -> () typealias CompanyBlock = (_ model: YHCompanyModelListModel) -> ()
typealias SelectBlock = (_ selectIndex: [Int]) -> ()
var companyBlock: CompanyBlock? var companyBlock: CompanyBlock?
var workExperienceBlock: WorkExperienceBlock? var workExperienceBlock: WorkExperienceBlock?
var selectBlock: SelectBlock?
var centerView: UIView! var centerView: UIView!
var titleLabel: UILabel! var titleLabel: UILabel!
var mainItemView: UIView! var mainItemView: UIView!
var country: String = "" var selectItem: Int = 5
var dataSource: YHSectionWorkExperienceModel?{ var dataSource: YHSectionWorkExperienceModel?{
didSet { didSet {
updateAllViews() updateAllViews()
...@@ -107,27 +109,17 @@ class YHWorkExperienceTableViewCell: UITableViewCell { ...@@ -107,27 +109,17 @@ class YHWorkExperienceTableViewCell: UITableViewCell {
let isShow = data?.isShowPrompts ?? false let isShow = data?.isShowPrompts ?? false
let message = data?.message ?? "" let message = data?.message ?? ""
var h = 51 var h = 51
if data?.id == .id13 {
h = 71
}
if isShow && message.count == 0 { if isShow && message.count == 0 {
h = h + 20 h = h + 20
} }
let itemView = YHWorkExperienceItemView() let itemView = YHWorkExperienceItemView()
itemView.dataSource = data itemView.dataSource = data
itemView.country = country
itemView.block = {[weak self] model in itemView.block = {[weak self] model in
guard let self = self else { return } guard let self = self else { return }
if let block = self.workExperienceBlock { if let block = self.workExperienceBlock {
block(model) block(model)
} }
} }
itemView.companyBlock = {[weak self] company in
guard let self = self else { return }
if let block = self.companyBlock {
block(company)
}
}
mainItemView.addSubview(itemView) mainItemView.addSubview(itemView)
itemView.snp.makeConstraints { make in itemView.snp.makeConstraints { make in
make.left.equalTo(18) make.left.equalTo(18)
...@@ -138,14 +130,15 @@ class YHWorkExperienceTableViewCell: UITableViewCell { ...@@ -138,14 +130,15 @@ class YHWorkExperienceTableViewCell: UITableViewCell {
y = y + h y = y + h
if i == 1 { if i == 1 {
let view = YHWorkExperienceSelectView(frame: CGRect(x: 0, y: y, width: Int(KScreenWidth) - 32, height: 386)) let view = YHWorkExperienceSelectView(frame: CGRect(x: 0, y: y, width: Int(KScreenWidth) - 32, height: 386))
view.selectItem = [selectItem]
view.dataSource = selectDataSource view.dataSource = selectDataSource
view.selectBlock = { [weak self] index in
guard let self = self else { return }
if let block = self.selectBlock {
block(index)
}
}
mainItemView.addSubview(view) mainItemView.addSubview(view)
// itemView.snp.makeConstraints { make in
// make.left.equalTo(18)
// make.top.equalTo(y)
// make.height.equalTo(386)
// make.right.equalTo(-18)
// }
y = y + 386 y = y + 386
} }
} }
......
...@@ -20,8 +20,8 @@ class YHWorkExperienceViewModel: YHBaseViewModel { ...@@ -20,8 +20,8 @@ class YHWorkExperienceViewModel: YHBaseViewModel {
func getBaseDataSource(_ isShowPrompt: Bool) -> [YHSectionWorkExperienceModel] { func getBaseDataSource(_ isShowPrompt: Bool) -> [YHSectionWorkExperienceModel] {
let item = YHWorkExperienceModel(id: .id1, isNeed: true, title: "用人单位", isUserKeyBoard: true, prompts: "请输入", message: mainModel.company_name, isShowPrompts: isShowPrompt, alertMessage:"请输入") let item = YHWorkExperienceModel(id: .id1, isNeed: true, title: "用人单位", isUserKeyBoard: true, prompts: "请输入", message: mainModel.company_name, isShowPrompts: isShowPrompt, alertMessage:"请输入")
let item1 = YHWorkExperienceModel(id: .id2, isNeed: true, title: "公司基本情况", isUserKeyBoard: false, prompts: "请选择", message: mainModel.industry, type: .nature, isShowPrompts: isShowPrompt, alertMessage:"请选择") let item1 = YHWorkExperienceModel(id: .id2, isNeed: true, title: "公司基本情况", isUserKeyBoard: false, prompts: "请选择", message: mainModel.industry, type: .company, isShowPrompts: isShowPrompt, alertMessage:"请选择")
let item2 = YHWorkExperienceModel(id: .id19, isNeed: true, title: "职位水平类别", isUserKeyBoard: false, prompts: "请选择", message: "\(mainModel.professional_level)", type: .level, isShowPrompts: isShowPrompt, alertMessage:"请选择") let item2 = YHWorkExperienceModel(id: .id3, isNeed: true, title: "职位水平类别", isUserKeyBoard: false, prompts: "请选择", message: "\(mainModel.professional_level)", type: .level, isShowPrompts: isShowPrompt, alertMessage:"请选择")
var section = YHSectionWorkExperienceModel() var section = YHSectionWorkExperienceModel()
section = YHSectionWorkExperienceModel(title: "企业信息", models: [item, item1, item2]) section = YHSectionWorkExperienceModel(title: "企业信息", models: [item, item1, item2])
return [section] return [section]
...@@ -30,122 +30,17 @@ class YHWorkExperienceViewModel: YHBaseViewModel { ...@@ -30,122 +30,17 @@ class YHWorkExperienceViewModel: YHBaseViewModel {
func updateModel(_ item: YHWorkExperienceModel) { func updateModel(_ item: YHWorkExperienceModel) {
guard let type = item.id else { return } guard let type = item.id else { return }
switch type { switch type {
case .id1: // 用人单位 case .id1: // 用人单位
mainModel.company_name = item.message ?? "" mainModel.company_name = item.message ?? ""
case .id2: // 用人单位性质 case .id2: // 用人单位性质
mainModel.industry = item.message ?? "" mainModel.industry = item.message ?? ""
case .id3: // 用人单位介绍 case .id3: // 职位水平类型
mainModel.company_introduce = item.message ?? ""
case .id4: // 用人单位官网
mainModel.company_website = item.message ?? ""
case .id5: // 工作地区国家
mainModel.location.country = item.message ?? ""
case .id6: // 工作城市 国内
mainModel.location.area = item.value ?? []
case .id7: // 工作城市国外
mainModel.location.foreign = item.message ?? ""
case .id8: // 职位
mainModel.position = item.message ?? ""
case .id9: // 入职年月
let format = DateFormatter()
format.dateFormat = "yyyy-MM"
if let selectDate = format.date(from:item.message ?? "") {
let selectTimeInterval = selectDate.timeIntervalSince1970
let currentTimeInterval = Date().timeIntervalSince1970
if selectTimeInterval > currentTimeInterval {
YHHUD.flash(message: "入职日期不能晚于当前日期")
} else {
guard let endDate = format.date(from: mainModel.departure_time) else {
mainModel.entry_time = item.message ?? ""
return
}
let endTimeInterval = endDate.timeIntervalSince1970
if selectTimeInterval > endTimeInterval {
YHHUD.flash(message: "入职日期不能晚于离职日期")
} else {
mainModel.entry_time = item.message ?? ""
}
}
}
case .id10: // 离职年月
let format = DateFormatter()
format.dateFormat = "yyyy-MM"
if let selectDate = format.date(from:item.message ?? ""), let startDate = format.date(from:mainModel.entry_time) {
let selectTimeInterval = selectDate.timeIntervalSince1970
let startTimeInterval = startDate.timeIntervalSince1970
if selectTimeInterval < startTimeInterval {
YHHUD.flash(message: "离职日期不能早于入职日期")
} else {
mainModel.departure_time = item.message ?? ""
}
} else {
mainModel.departure_time = item.message ?? ""
}
case .id11: // 工作证明文件
mainModel.work_certificate = item.message ?? ""
case .id12: // 职责性质
mainModel.duty = item.message ?? ""
case .id13: // 是否国际工作经验
mainModel.international_work_experience = Int(item.value?.first ?? "0") ?? 0
case .id14: // 企业人数规模
mainModel.company_member_total = Int(item.message ?? "0") ?? 0
case .id15: // 行政架构层级
mainModel.administrative_level = Int(item.value?.first ?? "0") ?? 0
case .id16: // 下属管理人数
mainModel.company_manage_total = Int(item.message ?? "0") ?? 0
case .id17: // 公司营业额/港元
mainModel.turnover = Int(item.message ?? "0") ?? 0
case .id18: // 公司性质/范畴/所属行业
mainModel.business_nature = item.message ?? ""
case .id19: // 职位水平类型
mainModel.professional_level = Int(item.value?.first ?? "0") ?? 0 mainModel.professional_level = Int(item.value?.first ?? "0") ?? 0
case .id20: // 高管证明文件 default : break
mainModel.executives_certificate = item.message ?? ""
case .id21: // 高管在职开始时间
let format = DateFormatter()
format.dateFormat = "yyyy-MM"
if let selectDate = format.date(from:item.message ?? "") {
let selectTimeInterval = selectDate.timeIntervalSince1970
let currentTimeInterval = Date().timeIntervalSince1970
if selectTimeInterval > currentTimeInterval {
YHHUD.flash(message: "高管在职开始时间不能晚于当前日期")
} else {
guard let endDate = format.date(from: mainModel.top_manager_end_at) else {
mainModel.top_manager_start_at = item.message ?? ""
return
}
let endTimeInterval = endDate.timeIntervalSince1970
if selectTimeInterval > endTimeInterval {
YHHUD.flash(message: "高管在职开始时间不能晚于离职日期")
} else {
mainModel.top_manager_start_at = item.message ?? ""
}
}
}
case .id22: // 高管在职结束时间
let format = DateFormatter()
format.dateFormat = "yyyy-MM"
if let selectDate = format.date(from:item.message ?? ""), let startDate = format.date(from:mainModel.top_manager_start_at) {
let selectTimeInterval = selectDate.timeIntervalSince1970
let startTimeInterval = startDate.timeIntervalSince1970
if selectTimeInterval < startTimeInterval {
YHHUD.flash(message: "高管在职结束时间不能早于开始日期")
} else {
mainModel.top_manager_end_at = item.message ?? ""
}
} else {
mainModel.top_manager_end_at = item.message ?? ""
}
} }
} }
func updateModel(_ item: YHCompanyModelListModel) {
mainModel.company_name = item.company_name ?? ""
mainModel.company_introduce = item.company_introduce ?? ""
mainModel.company_website = item.company_link ?? ""
}
func updateWduty(_ value: String) { func updateWduty(_ value: String) {
mainModel.wduty = value mainModel.wduty = value
} }
...@@ -180,10 +75,10 @@ class YHWorkExperienceViewModel: YHBaseViewModel { ...@@ -180,10 +75,10 @@ class YHWorkExperienceViewModel: YHBaseViewModel {
} }
} }
func requestWorkDetail(_ workId: String, callBackBlock:@escaping (_ success: Bool?, _ error:YHErrorModel?)->()) { func requestWorkDetail(_ orderId: String, _ workId: String, callBackBlock:@escaping (_ success: Bool?, _ error:YHErrorModel?)->()) {
// let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.WorkExperience.detail + "?id=\(workId)" // let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.WorkExperience.detail + "?id=\(workId)"
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.WorkExperience.detail let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.WorkExperience.detail
let param: [String: Any] = ["id": workId] let param: [String: Any] = ["work_id": workId, "order_id": orderId]
let _ = YHNetRequest.getRequest(url: strUrl,params: param) { [weak self] json, code in let _ = YHNetRequest.getRequest(url: strUrl,params: param) { [weak self] json, code in
//1. json字符串 转 对象 //1. json字符串 转 对象
...@@ -242,7 +137,7 @@ class YHWorkExperienceViewModel: YHBaseViewModel { ...@@ -242,7 +137,7 @@ class YHWorkExperienceViewModel: YHBaseViewModel {
"executives_certificate": mainModel.executives_certificate, "executives_certificate": mainModel.executives_certificate,
"file": file, "file": file,
"highlights": mainModel.highlights, "highlights": mainModel.highlights,
"id": mainModel.id, // "id": mainModel.id,
"order_id": orderID, "order_id": orderID,
"industry": mainModel.industry, "industry": mainModel.industry,
"international_work_experience": mainModel.international_work_experience, "international_work_experience": mainModel.international_work_experience,
...@@ -282,7 +177,7 @@ class YHWorkExperienceViewModel: YHBaseViewModel { ...@@ -282,7 +177,7 @@ class YHWorkExperienceViewModel: YHBaseViewModel {
callBackBlock(false,nil) callBackBlock(false,nil)
return return
} }
self.mainModel.id = result.id // self.mainModel.id = result.id
callBackBlock(true, nil) callBackBlock(true, nil)
} else { } else {
let error : YHErrorModel = YHErrorModel(errorCode:Int32(json.code), errorMsg: json.msg) let error : YHErrorModel = YHErrorModel(errorCode:Int32(json.code), errorMsg: json.msg)
......
//
// YHWorkIntroductionViewModel.swift
// galaxy
//
// Created by EDY on 2024/2/21.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import Alamofire
class YHWorkIntroductionViewModel: YHBaseViewModel {
var introducetionExampleModels: [YHWorkExampleModel]?
override init() {
super.init()
}
func requestIntroducetionExample(callBackBlock:@escaping (_ success: Bool?, _ error:YHErrorModel?)->()) {
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.WorkExperience.projectExample
let _ = YHNetRequest.getRequest(url: strUrl) { [weak self] json, code in
//1. json字符串 转 对象
guard let self = self else { return }
if json.code == 200 {
guard let dic = json.data?.peel as? [Any], let result = [YHWorkExampleModel].deserialize(from: dic) else {
callBackBlock(false,nil)
return
}
self.introducetionExampleModels = result as? [YHWorkExampleModel]
callBackBlock(true, nil)
} else {
let error : YHErrorModel = YHErrorModel(errorCode:Int32(json.code), errorMsg: json.msg)
callBackBlock(false, error)
}
} failBlock: { err in
callBackBlock(false,err)
}
}
// 0保存 1下一步
func saveWorkProjectDetail(_ workModel: YHWorkExperienceDetailModel, projectModel: YHWorkExperienceProjectModel, callBackBlock:@escaping (_ success: Bool, _ error:YHErrorModel?)->()) {
let params: [String : Any] = ["id": projectModel.id ?? 0,
"order_id": workModel.order_id,
"work_id": workModel.id,
"project_name": projectModel.project_name ?? "",
"project_start_time": projectModel.project_start_time ?? "",
"project_end_time": projectModel.project_end_time ?? "",
"project_highlights": projectModel.project_highlights ?? 0,
"create_from_appid": projectModel.create_from_appid ?? 2,
"update_from_appid": projectModel.create_from_appid ?? 2
]
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.WorkExperience.saveProject
let _ = YHNetRequest.postRequest(url: strUrl, params: params) { [weak self] json, code in
guard let self = self else { return }
if json.code == 200 {
callBackBlock(true, nil)
} else {
let error : YHErrorModel = YHErrorModel(errorCode:Int32(json.code), errorMsg: json.msg)
callBackBlock(false, error)
}
} failBlock: { err in
callBackBlock(false, err)
}
}
func requestFileMessage(_ url: String, callBackBlock:@escaping (_ success: Bool, _ model: YHFileContent?,_ error:YHErrorModel?)->()) {
// let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.WorkExperience.ocrFileContent + "?file_url=\(url)"
let strUrl = YHBaseUrlManager.shared.curOssURL() + YHAllApiName.OCR.normal
let param: [String: Any] = ["url": url]
let _ = YHNetRequest.postRequest(url: strUrl,params:param) { [weak self] json, code in
//1. json字符串 转 对象
guard let self = self else { return }
if json.code == 200 {
guard let dic = json.data?.peel as? [String : Any], let result = YHFileContent.deserialize(from: dic) else {
callBackBlock(false, nil, nil)
return
}
callBackBlock(true, result, nil)
} else {
let error : YHErrorModel = YHErrorModel(errorCode:Int32(json.code), errorMsg: json.msg)
callBackBlock(false, nil,error)
}
} failBlock: { err in
callBackBlock(false, nil, err)
}
}
}
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
import UIKit import UIKit
class YHWorkItemListViewModel: YHBaseViewModel { class YHWorkItemListViewModel: YHBaseViewModel {
var mainModel: YHWorkModel = YHWorkModel()
var mainModel: [YHWorkItemListModel]? var listModel: [YHWorkItemListModel]?
override init() { override init() {
super.init() super.init()
...@@ -29,8 +29,9 @@ class YHWorkItemListViewModel: YHBaseViewModel { ...@@ -29,8 +29,9 @@ class YHWorkItemListViewModel: YHBaseViewModel {
callBackBlock([],nil) callBackBlock([],nil)
return return
} }
self.mainModel = result.list self.mainModel = result
callBackBlock(self.mainModel, nil) self.listModel = result.list
callBackBlock(self.listModel, nil)
} else { } else {
let error : YHErrorModel = YHErrorModel(errorCode:Int32(json.code), errorMsg: json.msg) let error : YHErrorModel = YHErrorModel(errorCode:Int32(json.code), errorMsg: json.msg)
callBackBlock([], error) callBackBlock([], error)
...@@ -73,4 +74,23 @@ class YHWorkItemListViewModel: YHBaseViewModel { ...@@ -73,4 +74,23 @@ class YHWorkItemListViewModel: YHBaseViewModel {
callBackBlock(false, err) callBackBlock(false, err)
} }
} }
func requestWorkTimeRemarkWorkExperience(_ orderId: String, callBackBlock:@escaping (_ success: Bool?, _ error:YHErrorModel?)->()) {
let params: [String : Any] = ["order_id": orderId,
"work_time_overlap_remark": self.mainModel.work_time_overlap_remark,
"work_time_empty_remark": self.mainModel.work_time_empty_remark]
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.WorkExperience.saveWorkTimeRemark
let _ = YHNetRequest.postRequest(url: strUrl, params: params) { [weak self] json, code in
//1. json字符串 转 对象
guard let self = self else { return }
if json.code == 200 {
callBackBlock(true, nil)
} else {
let error : YHErrorModel = YHErrorModel(errorCode:Int32(json.code), errorMsg: json.msg)
callBackBlock(false, error)
}
} failBlock: { err in
callBackBlock(false, err)
}
}
} }
...@@ -225,12 +225,13 @@ class YHAllApiName { ...@@ -225,12 +225,13 @@ class YHAllApiName {
struct WorkExperience { struct WorkExperience {
//工作经验列表 //工作经验列表
static let list = "infoflow/work/list" static let list = "infoflow/work/v1/list"
//工作经验详情 //工作经验详情
static let detail = "infoflow/work/detail" static let detail = "infoflow/work/v1/workDetail"
//工作经验保存 //工作经验保存
static let save = "infoflow/work/save" static let save = "infoflow/work/save"
static let saveAll = "infoflow/work/save-all" static let saveAll = "infoflow/work/save-all"
static let saveWorkTimeRemark = "infoflow/work/v1/saveWorkTimeRemark"
//公司列表 //公司列表
static let company = "infoflow/company/search" static let company = "infoflow/company/search"
//工作经历删除 //工作经历删除
...@@ -631,4 +632,15 @@ class YHAllApiName { ...@@ -631,4 +632,15 @@ class YHAllApiName {
static let result = "super-app/renewal/renewal-result" static let result = "super-app/renewal/renewal-result"
} }
struct IncomeRecord {
// 收入信息
static let incomeList = "infoflow/order/income/get-income-work-company-list"
// 公司收入详情
static let incomeDetail = "infoflow/order/income/detail"
// 收入信息编辑
static let updateDetail = "infoflow/order/income/update-detail"
// 收入情况保存和提交
static let incomeUpdate = "infoflow/order/income/update"
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment