Commit 80095dde authored by 曹云霄's avatar 曹云霄

密码修改完成,修复工单模块部分字段为空,优化刷新机制,优化悬浮框

parent 18f8fd9c
This diff is collapsed.
...@@ -17,4 +17,29 @@ class BaseTableViewController: UITableViewController { ...@@ -17,4 +17,29 @@ class BaseTableViewController: UITableViewController {
} }
automaticallyAdjustsScrollViewInsets = false automaticallyAdjustsScrollViewInsets = false
} }
// MARK: - 生成随机字符串
open func randomMD5() -> String {
let identifier = CFUUIDCreate(nil)
let identifierString = CFUUIDCreateString(nil, identifier) as String
let cStr = identifierString.cString(using: .utf8)
var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))
CC_MD5(cStr, CC_LONG(strlen(cStr)), &digest)
var output = String()
for i in digest {
output = output.appendingFormat("%02X", i)
}
return output;
}
// MARK: - 保存图片附件至沙盒
open func saveImage(currentImage: UIImage, persent: CGFloat, imageName: String) ->String {
if let imageData = UIImageJPEGRepresentation(currentImage, persent) as NSData? {
let fullPath = NSHomeDirectory().appending("/Documents/Files").appending(imageName)
imageData.write(toFile: fullPath, atomically: true)
return fullPath
}
return ""
}
} }
...@@ -7,7 +7,37 @@ ...@@ -7,7 +7,37 @@
// //
import UIKit import UIKit
import RxCocoa
import RxSwift
class BaseViewModel: NSObject { class BaseViewModel: NSObject {
// MARK: - 检查版本更新
func updateVersion() ->Observable<(Bool,String,String)> {
return Observable.create({ (observer) -> Disposable in
Network.request(target: .UpdateVersion(), success: { (json) in
let resultModel = UpdateVersionModel.deserialize(from: json.dictionaryObject)
guard resultModel?.data != nil else {
ShowMessage("数据异常")
return
}
if resultModel!.success {
let index = NSString.compareVersion(UIDevice.appVersion(), string: resultModel?.data.version)
if index == -1 {
if resultModel?.data.forceUpdate == 1 {
observer.onNext((true, resultModel!.data.url,resultModel!.data.version))
}else {
observer.onNext((false, resultModel!.data.url,resultModel!.data.version))
}
}
}else {
ShowMessage(resultModel!.message)
}
}, failure: { (error) in
ShowMessage(error.localizedDescription)
})
return Disposables.create()
})
}
} }
//
// NSString+Helper.h
// IFS
//
// Created by 曹云霄 on 2018/1/17.
// Copyright © 2018年 上海勾芒信息科技有限公司. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface NSString (Helper)
/**
* 比较版本号
*
* @param string1 第一个版本号
* @param string2 第二个版本号
*
* @return 如果版本号相等,返回 0,
* 如果第一个版本号低于第二个,返回 -1,否则返回 1.
*/
+ (NSInteger)compareVersion:(NSString *)string1 string:(NSString *)string2;
@end
//
// NSString+Helper.m
// IFS
//
// Created by 曹云霄 on 2018/1/17.
// Copyright © 2018年 上海勾芒信息科技有限公司. All rights reserved.
//
#import "NSString+Helper.h"
@implementation NSString (Helper)
/**
* 比较版本号
*
* @param string1 第一个版本号
* @param string2 第二个版本号
*
* @return 如果版本号相等,返回 0,
* 如果第一个版本号低于第二个,返回 -1,否则返回 1.
*/
+ (NSInteger)compareVersion:(NSString *)string1 string:(NSString *)string2
{
int result = compareVersion([string1 UTF8String], [string2 UTF8String]);
switch (result) {
case 0:
return 0;
case -1:
return -1;
case 1:
return 1;
default:
break;
}
return NO;
}
/**
* 比较版本号
*
* @param v1 第一个版本号
* @param v2 第二个版本号
*
* @return 如果版本号相等,返回 0,
* 如果第一个版本号低于第二个,返回 -1,否则返回 1.
*/
int compareVersion(const char *v1, const char *v2)
{
assert(v1);
assert(v2);
const char *p_v1 = v1;
const char *p_v2 = v2;
while (*p_v1 && *p_v2) {
char buf_v1[32] = {0};
char buf_v2[32] = {0};
char *i_v1 = strchr(p_v1, '.');
char *i_v2 = strchr(p_v2, '.');
if (!i_v1 || !i_v2) break;
if (i_v1 != p_v1) {
strncpy(buf_v1, p_v1, i_v1 - p_v1);
p_v1 = i_v1;
}
else
p_v1++;
if (i_v2 != p_v2) {
strncpy(buf_v2, p_v2, i_v2 - p_v2);
p_v2 = i_v2;
}
else
p_v2++;
int order = atoi(buf_v1) - atoi(buf_v2);
if (order != 0)
return order < 0 ? -1 : 1;
}
double res = atof(p_v1) - atof(p_v2);
if (res < 0) return -1;
if (res > 0) return 1;
return 0;
}
@end
...@@ -55,6 +55,19 @@ public enum REPAIR_ORDER_SECTION: Int { ...@@ -55,6 +55,19 @@ public enum REPAIR_ORDER_SECTION: Int {
} }
/// 子工单详情界面分区
///
/// - STATE: 工单状态
/// - SOURCE: 工单来源
/// - COST: 费用
/// - DESCRIBE: 描述
public enum CHILD_BILL_DETAIL_SECTION: Int {
case STATE = 0
case SOURCE
case COST
case DESCRIBE
}
/// 工单详情界面分区 /// 工单详情界面分区
/// ///
/// - STATE: 工单状态 /// - STATE: 工单状态
...@@ -200,6 +213,16 @@ public enum FILTER_TYPE: Int { ...@@ -200,6 +213,16 @@ public enum FILTER_TYPE: Int {
case MULTIPLE case MULTIPLE
} }
/// 工单详情悬浮框按钮
///
/// - GET: 领取
/// - COMPLETED: 完成
public enum SUSPEND_BUTTON_TYPE: String {
case GET = "领单"
case COMPLETED = "完成"
}
......
...@@ -7,3 +7,9 @@ ...@@ -7,3 +7,9 @@
// //
import Foundation import Foundation
/// 更新工单列表数据
public let UPDATE_BILL_LIST: String = "UPDATE_BILL_LIST"
/// 更新工单列表数据
public let UPDATE_BILL_DETAIL_LIST: String = "UPDATE_BILL_DETAIL_LIST"
...@@ -16,10 +16,9 @@ public let kMainColor: UIColor = UIColor.RGB(67, g: 132, b: 196) ...@@ -16,10 +16,9 @@ public let kMainColor: UIColor = UIColor.RGB(67, g: 132, b: 196)
public let kBlueColor: UIColor = UIColor.RGB(77, g: 131, b: 242) public let kBlueColor: UIColor = UIColor.RGB(77, g: 131, b: 242)
public let kGaryColor: UIColor = UIColor.RGB(240, g: 240, b: 240) public let kGaryColor: UIColor = UIColor.RGB(240, g: 240, b: 240)
public let kLightGaryColor: UIColor = UIColor.RGB(170, g: 170, b: 170) public let kLightGaryColor: UIColor = UIColor.RGB(170, g: 170, b: 170)
public let kYellowColor: UIColor = UIColor.RGB(253, g: 156, b: 79)
public let kBlackColor: UIColor = UIColor.black public let kBlackColor: UIColor = UIColor.black
// MARK: - 全局常用属性 // MARK: - 全局常用属性
public let kNavHeight: CGFloat = 64 public let kNavHeight: CGFloat = 64
public let kCellHeight: CGFloat = 44 public let kCellHeight: CGFloat = 44
...@@ -31,17 +30,24 @@ public let kPageSize: Int = 15 ...@@ -31,17 +30,24 @@ public let kPageSize: Int = 15
public let kSectionZero: CGFloat = 0.01 public let kSectionZero: CGFloat = 0.01
public let kSectionTen: CGFloat = 10 public let kSectionTen: CGFloat = 10
public let kEmptyHeight: CGFloat = 108 public let kEmptyHeight: CGFloat = 108
public let kAnimationTime: TimeInterval = 0.3
public let kWidth: CGFloat = UIScreen.main.bounds.size.width public let kWidth: CGFloat = UIScreen.main.bounds.size.width
public let kHeight: CGFloat = UIScreen.main.bounds.size.height public let kHeight: CGFloat = UIScreen.main.bounds.size.height
public let kWindow: UIWindow = ((UIApplication.shared.delegate?.window)!)! public let kWindow: UIWindow = ((UIApplication.shared.delegate?.window)!)!
/// 用户信息 /// 用户信息
public func kUser() -> UserModel { public func kUser() -> UserModel {
return AppManager.shareInstance.userModel! return AppManager.shareInstance.userModel!
} }
/// 工单状态回调
public typealias BillStateBlock = (String) ->Void
/// 悬浮框透明度回调
public typealias SuspendViewAlphaBlock = (CGFloat) ->Void
/// 悬浮框状态回调
public typealias SuspendViewStateBlock = (BillDetailExecute,IndexPath,String) ->Void
/// 图片加载占位图
public let loadingImage: UIImage = UIImage(named: "loading")!
......
...@@ -10,15 +10,23 @@ import Foundation ...@@ -10,15 +10,23 @@ import Foundation
/// BaseUrl /// BaseUrl
//public let BaseUrl: String = "http://192.168.1.176:9030/ifs-server/rest" public let BaseUrl: String = "http://192.168.1.176:9030/ifs-server/rest"
//public let BaseAttachmentUrl: String = "http://192.168.1.176:9030" public let BaseAttachmentUrl: String = "http://192.168.1.176:9030"
public let BaseUrl: String = "http://dev.gomoretech.com/ifs-server/rest" //测试环境
public let BaseAttachmentUrl: String = "http://dev.gomoretech.com" //public let BaseUrl: String = "http://222.180.250.18:7080/ifs-server/rest"
//public let BaseAttachmentUrl: String = "http://222.180.250.18:7080"
//外网开发环境
//public let BaseUrl: String = "http://dev.gomoretech.com/ifs-server/rest"
//public let BaseAttachmentUrl: String = "http://dev.gomoretech.com"
/// 登录 /// 登录
public let loginUrl: String = "/user/login/%@" public let loginUrl: String = "/user/login/%@"
/// 更新版本
public let updateUrl = "/ipapk?type=ipa";
/// 修改密码
public let changePassword = "/user/change_password/%@?time=%@&operId=%@&operName=%@";
/// 待办事项 /// 待办事项
public let todoUrl: String = "/todo/workExecute/query" public let todoUrl: String = "/todo/workExecute/query"
/// 新建工单来源 /// 新建工单来源
...@@ -39,6 +47,8 @@ public let saveRepairOrderUrl: String = "/work/saveOrUpdate" ...@@ -39,6 +47,8 @@ public let saveRepairOrderUrl: String = "/work/saveOrUpdate"
public let repairOrderUrl: String = "/work/query" public let repairOrderUrl: String = "/work/query"
/// 工单详情get /// 工单详情get
public let getBillDetailUrl: String = "/work/get/%@" public let getBillDetailUrl: String = "/work/get/%@"
/// 子单详情get
public let getChildBillDetailUrl: String = "/work/getWorkExecute/%@"
/// 工单详情转交部门 /// 工单详情转交部门
public let organizationUrl : String = "/organization/query" public let organizationUrl : String = "/organization/query"
/// 工单详情转交 /// 工单详情转交
...@@ -62,7 +72,9 @@ public let attachmentUrl: String = "\(BaseAttachmentUrl)/ifs-web/attachment/down ...@@ -62,7 +72,9 @@ public let attachmentUrl: String = "\(BaseAttachmentUrl)/ifs-web/attachment/down
/// 子工单领单 /// 子工单领单
public let drawExecute: String = "/work/drawExecute/%@" public let drawExecute: String = "/work/drawExecute/%@"
/// 子工单保存及提交 /// 子工单保存及提交
public let saveExecute: String = "/work/saveExecute/%@" public let saveExecute: String = "/work/saveExecute"
/// 子工单完成
public let finishExecute: String = "/work/finishExecute"
......
...@@ -8,33 +8,10 @@ ...@@ -8,33 +8,10 @@
import UIKit import UIKit
extension NSString { extension String {
/*
#pragma mark - 获取当前时间之前或者之后的时间(之前传入负数)
+ (NSString *)getTimeby:(NSInteger)day
{
NSDate *nowDate = [NSDate date];
NSDate *theDate;
if(day!=0){
NSTimeInterval oneDay = 24*60*60*1; //1天的长度
theDate = [nowDate initWithTimeIntervalSinceNow: oneDay*day];
}else{
theDate = nowDate;
}
NSDateFormatter *date_formatter = [[NSDateFormatter alloc] init];
[date_formatter setDateFormat:@"yyyy-MM-dd"];
NSString *the_date_str = [date_formatter stringFromDate:theDate];
return the_date_str;
}
*/
// 计算字符串的宽度,高度 // 计算字符串的宽度,高度
open func calculateStringSize(_ size: CGSize,font: UIFont) ->CGSize { public func calculateStringSize(_ size: CGSize,font: UIFont) ->CGSize {
let attributes = [NSAttributedStringKey.font:font] let attributes = [NSAttributedStringKey.font:font]
let option = NSStringDrawingOptions.usesLineFragmentOrigin let option = NSStringDrawingOptions.usesLineFragmentOrigin
let rect:CGRect = self.boundingRect(with:CGSize(width: kWidth, height: kHeight) , options: option, attributes: attributes, context: nil) let rect:CGRect = self.boundingRect(with:CGSize(width: kWidth, height: kHeight) , options: option, attributes: attributes, context: nil)
...@@ -42,62 +19,10 @@ extension NSString { ...@@ -42,62 +19,10 @@ extension NSString {
} }
// 去掉字符串前后空格 // 去掉字符串前后空格
open func formatString() -> String { public func formatString() -> String {
let set = NSCharacterSet.whitespacesAndNewlines let set = NSCharacterSet.whitespacesAndNewlines
return self.trimmingCharacters(in: set) return self.trimmingCharacters(in: set)
} }
// MARK: - 富文本设置颜色
open func attributeString(_ colorString: String,_ color: UIColor) ->NSMutableAttributedString {
let range = self.range(of: colorString)
//富文本设置
let attributeString = NSMutableAttributedString(string:self as String)
//设置字体颜色
attributeString.addAttribute(NSAttributedStringKey.foregroundColor, value: color,range: range)
return attributeString
}
// MARK: - 带¥符号字符串
open func priceString() -> String {
return String(format: "¥%.2f", self.floatValue)
}
// MARK: - 获取路径文件大小
open func getFileSize() -> UInt64 {
var size: UInt64 = 0
let fileManager = FileManager.default
var isDir: ObjCBool = false
let isExists = fileManager.fileExists(atPath: self as String, isDirectory: &isDir)
// 判断文件存在
if isExists {
// 是否为文件夹
if isDir.boolValue {
// 迭代器 存放文件夹下的所有文件名
let enumerator = fileManager.enumerator(atPath: self as String)
for subPath in enumerator! {
// 获得全路径
let fullPath = self.appending("/\(subPath)")
do {
let attr = try fileManager.attributesOfItem(atPath: fullPath)
size += attr[FileAttributeKey.size] as! UInt64
} catch {
print("error :\(error)")
}
}
} else { // 单文件
do {
let attr = try fileManager.attributesOfItem(atPath: self as String)
size += attr[FileAttributeKey.size] as! UInt64
} catch {
print("error :\(error)")
}
}
}
return size
}
} }
......
...@@ -76,6 +76,7 @@ struct Network { ...@@ -76,6 +76,7 @@ struct Network {
do { do {
guard response.statusCode == 200 else { guard response.statusCode == 200 else {
print(response)
failure(MoyaError.statusCode(response)) failure(MoyaError.statusCode(response))
return return
} }
......
...@@ -34,6 +34,8 @@ public enum Service { ...@@ -34,6 +34,8 @@ public enum Service {
case QueryRepairOrder(RepairOrderQueryModel) case QueryRepairOrder(RepairOrderQueryModel)
// MARK: - 查询工单详情 // MARK: - 查询工单详情
case GetRepairOrderDetail(String) case GetRepairOrderDetail(String)
// MARK: - 查询子单详情
case GetChildBillDetail(String)
// MARK: - 查询工单详情转交部门 // MARK: - 查询工单详情转交部门
case GetRepairOrderDepartment() case GetRepairOrderDepartment()
// MARK: - 工单详情转交 // MARK: - 工单详情转交
...@@ -57,7 +59,13 @@ public enum Service { ...@@ -57,7 +59,13 @@ public enum Service {
// MARK: - 子工单工单uuid // MARK: - 子工单工单uuid
case GetChildBill(String) case GetChildBill(String)
// MARK: - 保存及更新子工单 // MARK: - 保存及更新子工单
case SaveChildBill(ChildBillSaveOrUpdateModel) case SaveChildBill(ChildBillDetailData)
// MARK: - 完成子工单
case FinishChildBill(ChildBillDetailData)
// MARK: - 检查版本更新
case UpdateVersion()
// MARK: - 修改密码
case ChangePassword(String)
} }
extension Service: TargetType { extension Service: TargetType {
...@@ -102,6 +110,9 @@ extension Service: TargetType { ...@@ -102,6 +110,9 @@ extension Service: TargetType {
case .SaveChildBill(_): case .SaveChildBill(_):
let path = saveExecute + "?operator.operId=\(kUser().userCode!)&operator.operName=\(kUser().userName!)&time=\(NSDate().httpParameterString()!)" let path = saveExecute + "?operator.operId=\(kUser().userCode!)&operator.operName=\(kUser().userName!)&time=\(NSDate().httpParameterString()!)"
return path.urlEncoded() return path.urlEncoded()
case .FinishChildBill(_):
let path = finishExecute + "?operator.operId=\(kUser().userCode!)&operator.operName=\(kUser().userName!)&time=\(NSDate().httpParameterString()!)"
return path.urlEncoded()
case .QueryToolOption: case .QueryToolOption:
return toolOptionUrl return toolOptionUrl
case .QueryProtectOption: case .QueryProtectOption:
...@@ -116,6 +127,13 @@ extension Service: TargetType { ...@@ -116,6 +127,13 @@ extension Service: TargetType {
return String(format: uploadAttachmentUrl, model.entityType,model.entityUuid) return String(format: uploadAttachmentUrl, model.entityType,model.entityUuid)
case .DownloadAttachment(let entity_type, let entity_uuid): case .DownloadAttachment(let entity_type, let entity_uuid):
return String(format: downloadAttachmentUrl, entity_type,entity_uuid) return String(format: downloadAttachmentUrl, entity_type,entity_uuid)
case .GetChildBillDetail(let uuid):
return String(format: getChildBillDetailUrl, uuid)
case .UpdateVersion():
return updateUrl
case .ChangePassword(_):
let path = String(format: changePassword, kUser().userUuid,NSDate().httpParameterString(),kUser().userCode,kUser().userName)
return path.urlEncoded()
} }
} }
...@@ -131,6 +149,9 @@ extension Service: TargetType { ...@@ -131,6 +149,9 @@ extension Service: TargetType {
.TransferOrder(_), .TransferOrder(_),
.CompleteOrder(_), .CompleteOrder(_),
.UploadAttachment(_), .UploadAttachment(_),
.SaveChildBill(_),
.ChangePassword(_),
.FinishChildBill(_),
.QueryInitiator(_): .QueryInitiator(_):
return .post return .post
case .QuerySource(), case .QuerySource(),
...@@ -141,8 +162,9 @@ extension Service: TargetType { ...@@ -141,8 +162,9 @@ extension Service: TargetType {
.QuerybrokenOption(), .QuerybrokenOption(),
.QueryprocessMethods(), .QueryprocessMethods(),
.DownloadAttachment(_, _), .DownloadAttachment(_, _),
.SaveChildBill(_),
.GetChildBill(_), .GetChildBill(_),
.GetChildBillDetail(_),
.UpdateVersion(),
.QueryPrority(): .QueryPrority():
return .get return .get
} }
...@@ -158,6 +180,12 @@ extension Service: TargetType { ...@@ -158,6 +180,12 @@ extension Service: TargetType {
return .requestParameters(parameters: ["password": password, return .requestParameters(parameters: ["password": password,
"authenticode": "211534962"], "authenticode": "211534962"],
encoding: JSONEncoding.default) encoding: JSONEncoding.default)
case .ChangePassword(let password):
let oldPassword = NSString(string: kUser().password)
let newPassword = NSString(string: password)
return .requestParameters(parameters: ["newPassword": newPassword.md5(),
"oldPassword": oldPassword.md5()],
encoding: JSONEncoding.default)
case .QueryTodo(let model): case .QueryTodo(let model):
return .requestParameters(parameters: model.toDictionary(), return .requestParameters(parameters: model.toDictionary(),
encoding: JSONEncoding.default) encoding: JSONEncoding.default)
...@@ -168,7 +196,9 @@ extension Service: TargetType { ...@@ -168,7 +196,9 @@ extension Service: TargetType {
.QueryProtectOption(), .QueryProtectOption(),
.QuerybrokenOption(), .QuerybrokenOption(),
.QueryprocessMethods(), .QueryprocessMethods(),
.GetChildBillDetail(_),
.DownloadAttachment(_,_), .DownloadAttachment(_,_),
.UpdateVersion(),
.GetChildBill(_), .GetChildBill(_),
.QueryPrority(): .QueryPrority():
return .requestPlain return .requestPlain
...@@ -197,8 +227,9 @@ extension Service: TargetType { ...@@ -197,8 +227,9 @@ extension Service: TargetType {
let data = MultipartFormData(provider: .file(URL(fileURLWithPath: attachmentModel.fileUrl)), name: "file", fileName: attachmentModel.fileName, mimeType: "image/jpeg") let data = MultipartFormData(provider: .file(URL(fileURLWithPath: attachmentModel.fileUrl)), name: "file", fileName: attachmentModel.fileName, mimeType: "image/jpeg")
return .uploadMultipart([data]) return .uploadMultipart([data])
case .SaveChildBill(let model): case .SaveChildBill(let model):
return .requestParameters(parameters: model.toDictionary(), return .requestParameters(parameters: model.toDictionary(), encoding: JSONEncoding.default)
encoding: JSONEncoding.default) case .FinishChildBill(let model):
return .requestParameters(parameters: model.toDictionary(), encoding: JSONEncoding.default)
} }
} }
......
...@@ -9,7 +9,9 @@ ...@@ -9,7 +9,9 @@
import UIKit import UIKit
import ImagePicker import ImagePicker
import SKPhotoBrowser import SKPhotoBrowser
import RxCocoa
import RxSwift
import SnapKit
/// 更新高度后回调 /// 更新高度后回调
...@@ -19,6 +21,9 @@ protocol PhotoAttachmentDelegate { ...@@ -19,6 +21,9 @@ protocol PhotoAttachmentDelegate {
class PhotoAttachmentViewController: BaseViewController { class PhotoAttachmentViewController: BaseViewController {
/// RxSwift自动释放
let disposeBag = DisposeBag()
/// 更新图片附件 /// 更新图片附件
var delegate: PhotoAttachmentDelegate? var delegate: PhotoAttachmentDelegate?
...@@ -28,6 +33,8 @@ class PhotoAttachmentViewController: BaseViewController { ...@@ -28,6 +33,8 @@ class PhotoAttachmentViewController: BaseViewController {
return attachmentViewModel return attachmentViewModel
}() }()
/// item 尺寸
var size: CGSize?
/// key /// key
var key: String? var key: String?
/// 间隔 /// 间隔
...@@ -56,9 +63,13 @@ class PhotoAttachmentViewController: BaseViewController { ...@@ -56,9 +63,13 @@ class PhotoAttachmentViewController: BaseViewController {
/// 设置item Size /// 设置item Size
open func setItemSize(_ size: CGSize, _ count: Int) { open func setItemSize(_ size: CGSize, _ count: Int) {
self.collectionViewFlowLayout.itemSize = size self.size = size
self.imageHeight = size.height self.imageHeight = size.height
self.COUNT = count self.COUNT = count
if let collectionViewFlowLayout = collectionViewFlowLayout {
collectionViewFlowLayout.itemSize = size
photoAttachmentCollectionView.reloadData()
}
} }
// MARK: - 设置图片附件 // MARK: - 设置图片附件
...@@ -66,8 +77,12 @@ class PhotoAttachmentViewController: BaseViewController { ...@@ -66,8 +77,12 @@ class PhotoAttachmentViewController: BaseViewController {
collectionViewFlowLayout.minimumLineSpacing = CGFloat(SPACE) collectionViewFlowLayout.minimumLineSpacing = CGFloat(SPACE)
collectionViewFlowLayout.minimumInteritemSpacing = CGFloat(SPACE) collectionViewFlowLayout.minimumInteritemSpacing = CGFloat(SPACE)
collectionViewFlowLayout.sectionInset = UIEdgeInsetsMake(CGFloat(SPACE), CGFloat(SPACE), CGFloat(SPACE), CGFloat(SPACE)) collectionViewFlowLayout.sectionInset = UIEdgeInsetsMake(CGFloat(SPACE), CGFloat(SPACE), CGFloat(SPACE), CGFloat(SPACE))
if let size = size {
collectionViewFlowLayout.itemSize = size
}else {
collectionViewFlowLayout.itemSize = CGSize(width: imageHeight * 4 / 3, height: imageHeight) collectionViewFlowLayout.itemSize = CGSize(width: imageHeight * 4 / 3, height: imageHeight)
} }
}
// MARK: - 计算图片附件所需高度 // MARK: - 计算图片附件所需高度
open func attachmentHeight(_ count: Int, _ key: String?) ->CGFloat { open func attachmentHeight(_ count: Int, _ key: String?) ->CGFloat {
......
...@@ -44,7 +44,7 @@ class PhotoAttachmentCollectionViewCell: UICollectionViewCell { ...@@ -44,7 +44,7 @@ class PhotoAttachmentCollectionViewCell: UICollectionViewCell {
deleteBtn.isHidden = true deleteBtn.isHidden = true
break break
case .ATTACHMENT_HTTP: case .ATTACHMENT_HTTP:
attachmentImg.kf.setImage(with: URL(string: model.attachment as! String)) attachmentImg.kf.setImage(with: URL(string: model.attachment as! String), placeholder: loadingImage)
attachmentImg.contentMode = .scaleAspectFill attachmentImg.contentMode = .scaleAspectFill
deleteBtn.isHidden = true deleteBtn.isHidden = true
break break
......
...@@ -31,7 +31,7 @@ class AboutUsTableViewController: BaseTableViewController { ...@@ -31,7 +31,7 @@ class AboutUsTableViewController: BaseTableViewController {
view.layoutIfNeeded() view.layoutIfNeeded()
appIconBgView.seth(h: kWidth * 9 / 16) appIconBgView.seth(h: kWidth * 9 / 16)
appVersionLab.text = UIDevice.version() appVersionLab.text = UIDevice.version()
// appIconImg.image = UIDevice.appIcon() appIconImg.image = UIDevice.appIcon()
appMobileLab.text = "15121161964" appMobileLab.text = "15121161964"
} }
} }
......
...@@ -8,15 +8,25 @@ ...@@ -8,15 +8,25 @@
import UIKit import UIKit
import Kingfisher import Kingfisher
import RxSwift
import PPBadgeViewSwift
class AccountTableViewController: BaseTableViewController { class AccountTableViewController: BaseTableViewController {
/// RxSwift自动释放
let disposeBag = DisposeBag()
/// 用户头像 /// 用户头像
@IBOutlet weak var userHeaderImg: UIImageView! @IBOutlet weak var userHeaderImg: UIImageView!
/// 用户名 /// 用户名
@IBOutlet weak var userNameLab: UILabel! @IBOutlet weak var userNameLab: UILabel!
/// 检查版本更新
@IBOutlet weak var checkVersionLabel: UILabel!
/// 账户背景 /// 账户背景
@IBOutlet weak var accountBgView: UIView! @IBOutlet weak var accountBgView: UIView!
/// 版本更新
var updateVerison: String?
/// 账户VieWModel /// 账户VieWModel
lazy final var accountViewModel: AccountViewModel = { lazy final var accountViewModel: AccountViewModel = {
var accountViewModel = AccountViewModel() var accountViewModel = AccountViewModel()
...@@ -27,6 +37,7 @@ class AccountTableViewController: BaseTableViewController { ...@@ -27,6 +37,7 @@ class AccountTableViewController: BaseTableViewController {
super.viewDidLoad() super.viewDidLoad()
uiConfigAction() uiConfigAction()
dataAction() dataAction()
updateVersion()
} }
// MARK: - 状态栏风格 // MARK: - 状态栏风格
...@@ -44,8 +55,23 @@ class AccountTableViewController: BaseTableViewController { ...@@ -44,8 +55,23 @@ class AccountTableViewController: BaseTableViewController {
// MARK: - 填充数据 // MARK: - 填充数据
fileprivate func dataAction() { fileprivate func dataAction() {
userNameLab.text = "曹云霄" userNameLab.text = kUser().userName
userHeaderImg.kf.setImage(with: URL(string: "https://upload.jianshu.io/users/upload_avatars/1603648/59f165f01901.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/240/h/240")) userHeaderImg.image = UIDevice.appIcon()
}
// MARK: - 检查版本更新
fileprivate func updateVersion() {
let viewModel = BaseViewModel()
viewModel.updateVersion().subscribe(onNext: {[weak self] (result) in
self?.updateVerison = result.1
if result.0 {
ShowAlertView(hint, String(format: "检测到有新版本<%@>需要更新", result.2), ["我知道了"], UIAlertControllerStyle.alert, { (index) in
UIApplication.shared.openURL(URL(string: result.1)!)
})
}else {
self?.checkVersionLabel.pp.addBadge(text: "新版本")
}
}).disposed(by: disposeBag)
} }
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
...@@ -58,9 +84,22 @@ class AccountTableViewController: BaseTableViewController { ...@@ -58,9 +84,22 @@ class AccountTableViewController: BaseTableViewController {
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true) tableView.deselectRow(at: indexPath, animated: true)
if indexPath.section == kONE && indexPath.row == kZERO { switch indexPath {
case IndexPath(row: 2, section: 0):
guard updateVerison != nil else {
ShowMessage("暂无更新")
return
}
UIApplication.shared.openURL(URL(string: updateVerison!)!)
break
case IndexPath(row: 0, section: 1):
accountViewModel.loginOutAction() accountViewModel.loginOutAction()
break
default:
break
} }
} }
} }
......
...@@ -12,7 +12,6 @@ import RxSwift ...@@ -12,7 +12,6 @@ import RxSwift
class ChangePasswordTableViewController: BaseTableViewController { class ChangePasswordTableViewController: BaseTableViewController {
/// RxSwift自动释放 /// RxSwift自动释放
let disposeBag = DisposeBag() let disposeBag = DisposeBag()
/// 旧密码 /// 旧密码
...@@ -23,7 +22,11 @@ class ChangePasswordTableViewController: BaseTableViewController { ...@@ -23,7 +22,11 @@ class ChangePasswordTableViewController: BaseTableViewController {
@IBOutlet weak var new2PasswordText: UITextField! @IBOutlet weak var new2PasswordText: UITextField!
/// 确认新密码 /// 确认新密码
@IBOutlet weak var affirmButton: UIButton! @IBOutlet weak var affirmButton: UIButton!
/// 账户VieWModel
lazy final var accountViewModel: AccountViewModel = {
var accountViewModel = AccountViewModel()
return accountViewModel;
}()
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
...@@ -67,7 +70,14 @@ class ChangePasswordTableViewController: BaseTableViewController { ...@@ -67,7 +70,14 @@ class ChangePasswordTableViewController: BaseTableViewController {
// MARK: - 确认新密码 // MARK: - 确认新密码
@IBAction func affirmButtonClickAction(_ sender: UIButton) { @IBAction func affirmButtonClickAction(_ sender: UIButton) {
if new2PasswordText.text != newPasswordText.text {
ShowMessage("请确认两次密码是否相同")
return
}
accountViewModel.changePasswordAction(new2PasswordText.text!).subscribe(onNext: {[weak self] () in
ShowMessage("密码修改成功")
self?.popVC()
}).disposed(by: disposeBag)
} }
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
......
...@@ -7,20 +7,61 @@ ...@@ -7,20 +7,61 @@
// //
import UIKit import UIKit
import RxSwift
import RxCocoa
class AccountViewModel: BaseViewModel { class AccountViewModel: BaseViewModel {
}
extension AccountViewModel {
// MARK: - 退出登录 // MARK: - 退出登录
func loginOutAction() { func loginOutAction() {
// ShowAlertView("提示", "请确认是否退出登录?", ["取消","确认"], .alert) { (index) in ShowAlertView("提示", "请确认是否退出登录?", ["取消","确认"], .alert) { (index) in
// if index == kZERO { return } if index == kZERO { return }
// do { do {
// try FileManager.default.removeItem(atPath: accountPath) try FileManager.default.removeItem(atPath: accountPath)
// }catch { }catch {
// ShowMessage("删除用户信息失败") ShowMessage("删除用户信息失败")
// } }
// AppManager.shareInstance.openLoginVc() AppManager.shareInstance.openLoginVc()
// } }
}
// MARK: - 修改密码
func changePasswordAction(_ newPassword: String) ->Observable<Void> {
return Observable.create({ (observer) -> Disposable in
Network.request(target: .ChangePassword(newPassword), success: { (json) in
let resultModel = PublicResultModel(fromJson: json)
if resultModel.success {
kUser().password = newPassword
observer.onNext(())
}else {
ShowMessage(resultModel.message)
}
}, failure: { (error) in
ShowMessage(error.localizedDescription)
})
return Disposables.create()
})
} }
} }
...@@ -74,21 +74,11 @@ class RepairOrderAddTableViewController: BaseTableViewController { ...@@ -74,21 +74,11 @@ class RepairOrderAddTableViewController: BaseTableViewController {
// MARK: - UI // MARK: - UI
fileprivate func uiConfigAction() { fileprivate func uiConfigAction() {
describeTextView.placeholder = "工单描述" describeTextView.placeholder = "工单描述"
tableView.register(UINib(nibName: RepairAttachmentTableViewCell.name(), bundle: nil), forCellReuseIdentifier: RepairAttachmentTableViewCell.name())
describeTextView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0) describeTextView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0)
tableView.register(UINib(nibName: RepairAttachmentTableViewCell.name(), bundle: nil), forCellReuseIdentifier: RepairAttachmentTableViewCell.name())
navigationItem.rightBarButtonItem = createButtonItem("提交", nil, self, #selector(RepairOrderAddTableViewController.submitButtonClickAction)) navigationItem.rightBarButtonItem = createButtonItem("提交", nil, self, #selector(RepairOrderAddTableViewController.submitButtonClickAction))
} }
// MARK: - 保存图片附件至沙盒
fileprivate func saveImage(currentImage: UIImage, persent: CGFloat, imageName: String) ->String {
if let imageData = UIImageJPEGRepresentation(currentImage, persent) as NSData? {
let fullPath = NSHomeDirectory().appending("/Documents/Files").appending(imageName)
imageData.write(toFile: fullPath, atomically: true)
return fullPath
}
return ""
}
// MARK: - 提交工单 // MARK: - 提交工单
@objc fileprivate func submitButtonClickAction() { @objc fileprivate func submitButtonClickAction() {
var fileUrlArray = Array<String>() var fileUrlArray = Array<String>()
...@@ -110,6 +100,7 @@ class RepairOrderAddTableViewController: BaseTableViewController { ...@@ -110,6 +100,7 @@ class RepairOrderAddTableViewController: BaseTableViewController {
self?.repairOrderAddViewModel.saveOrderModel.attachmentId = entityUuid self?.repairOrderAddViewModel.saveOrderModel.attachmentId = entityUuid
self?.repairOrderAddViewModel.submitRepairOrder().subscribe(onNext: {[weak self] (result) in self?.repairOrderAddViewModel.submitRepairOrder().subscribe(onNext: {[weak self] (result) in
ShowMessage("提交成功") ShowMessage("提交成功")
NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: UPDATE_BILL_LIST)))
self?.popVC() self?.popVC()
}).disposed(by: self!.disposeBag) }).disposed(by: self!.disposeBag)
} }
...@@ -123,20 +114,6 @@ class RepairOrderAddTableViewController: BaseTableViewController { ...@@ -123,20 +114,6 @@ class RepairOrderAddTableViewController: BaseTableViewController {
} }
} }
// MARK: - 生成随机字符串
fileprivate func randomMD5() -> String {
let identifier = CFUUIDCreate(nil)
let identifierString = CFUUIDCreateString(nil, identifier) as String
let cStr = identifierString.cString(using: .utf8)
var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))
CC_MD5(cStr, CC_LONG(strlen(cStr)), &digest)
var output = String()
for i in digest {
output = output.appendingFormat("%02X", i)
}
return output;
}
// MARK: - 设置附件VC // MARK: - 设置附件VC
fileprivate func setupPhotoAttachmentVc(){ fileprivate func setupPhotoAttachmentVc(){
addChildViewController(attachmentVc) addChildViewController(attachmentVc)
...@@ -153,6 +130,10 @@ class RepairOrderAddTableViewController: BaseTableViewController { ...@@ -153,6 +130,10 @@ class RepairOrderAddTableViewController: BaseTableViewController {
describeTextView.rx.text.subscribe(onNext: {[weak self] (string) in describeTextView.rx.text.subscribe(onNext: {[weak self] (string) in
self?.repairOrderAddViewModel.saveOrderModel.descriptionField = string self?.repairOrderAddViewModel.saveOrderModel.descriptionField = string
}).disposed(by: disposeBag) }).disposed(by: disposeBag)
phoneNumberText.rx.text.subscribe(onNext: {[weak self] (string) in
self?.repairOrderAddViewModel.saveOrderModel.reporterPhone = string
}).disposed(by: disposeBag)
} }
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
......
...@@ -7,15 +7,196 @@ ...@@ -7,15 +7,196 @@
// //
import UIKit import UIKit
import RxSwift
import RxCocoa
class RepairOrderChildBillDetailViewController: BaseTableViewController { class RepairOrderChildBillDetailViewController: BaseTableViewController {
/// 已发出状态
@IBOutlet weak var createdStateImg: UIImageView!
@IBOutlet weak var createStateLab: UILabel!
/// 处理中状态
@IBOutlet weak var processedStateImg: UIImageView!
@IBOutlet weak var processedStateLab: UILabel!
/// 已完成状态
@IBOutlet weak var completedStateImg: UIImageView!
@IBOutlet weak var completedStateLab: UILabel!
/// 领单人
@IBOutlet weak var operatorNameLabel: UILabel!
/// 单号
@IBOutlet weak var billNumberLab: UILabel!
/// 领单时间
@IBOutlet weak var billNumberTimeLabel: UILabel!
/// 备份工具
@IBOutlet weak var backupsToolLabel: UILabel!
/// 安全防护
@IBOutlet weak var safetyProtectionLabel: UILabel!
/// 出工人
@IBOutlet weak var workPersonLabel: UILabel!
/// 到位时间
@IBOutlet weak var placeTimeLabel: UILabel!
/// 离开时间
@IBOutlet weak var leaveTimeLabel: UILabel!
/// 故障原因
@IBOutlet weak var failureCauseLabel: UILabel!
/// 处理方式
@IBOutlet weak var processModeLabel: UILabel!
/// 人工费
@IBOutlet weak var costLaborLabel: UILabel!
/// 物料费用
@IBOutlet weak var materialCostLabel: UILabel!
/// 描述
@IBOutlet weak var describeLabel: UILabel!
/// 设备名称
@IBOutlet weak var deviceNameLabel: UILabel!
/// 附件宽度
let imageWidth = ((kWidth - 90) - CGFloat((3 + kONE) * 5)) / 3
/// RxSwift自动释放
let disposeBag = DisposeBag()
/// 默认section高度
let sectionHeight: CGFloat! = 30
/// 维修前图片附件高度
var beforAttachmentHeight: CGFloat! = 10
/// 维修后图片附件高度
var afterAttachmentHeight: CGFloat! = 10
/// 工单数据
open var billModel: BillDetailExecute!
/// 维修前图片附件
lazy final var beforAttachmentVc: PhotoAttachmentViewController = {
var attachmentVc = PhotoAttachmentViewController.instantiateViewController(.Function) as! PhotoAttachmentViewController
return attachmentVc
}()
/// 维修后图片附件
lazy final var afterAttachmentVc: PhotoAttachmentViewController = {
var attachmentVc = PhotoAttachmentViewController.instantiateViewController(.Function) as! PhotoAttachmentViewController
return attachmentVc
}()
/// 子工单详情ViewModel
lazy final var childBillViewModel: ReparirChildBillViewModel = {
var childBillViewModel = ReparirChildBillViewModel()
return childBillViewModel
}()
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
uiConfigAction()
getBillDetailAction()
}
// MARK: - UI
fileprivate func uiConfigAction() {
title = billModel.dept.name
tableView.register(UINib(nibName: RepairOrderDetailSectionView.name(), bundle: nil), forHeaderFooterViewReuseIdentifier: RepairOrderDetailSectionView.name())
tableView.register(UINib(nibName: MaintainBeforAttachmentTableViewCell.name(), bundle: nil), forCellReuseIdentifier: MaintainBeforAttachmentTableViewCell.name())
tableView.register(UINib(nibName: MaintainAfterAttachmentTableViewCell.name(), bundle: nil), forCellReuseIdentifier: MaintainAfterAttachmentTableViewCell.name())
addChildViewController(afterAttachmentVc)
addChildViewController(beforAttachmentVc)
}
// MARK: - 获取子工单详情
fileprivate func getBillDetailAction() {
childBillViewModel.queryChildBillDetailAction(billModel.uuid).subscribe {[weak self] (event) in
self?.childBillViewModel.childBillDetailAssignment(self!)
self?.childBillViewModel.billDetailStataDispose(self!)
self?.disposeAttachment()
}.disposed(by: disposeBag)
}
// MARK: - 获取图片附件通过entity uuid
fileprivate func disposeAttachment() {
if !childBillViewModel.childBillDetailData.beginAttachmentId.isEmpty {
childBillViewModel.downloadBeforAttachmentAction(childBillViewModel.childBillDetailData.beginAttachmentId)
.subscribe(onNext: {[weak self] (result) in
for model in result {
let url = String(format: attachmentUrl, model.entityType,model.entityUuid,model.fileName)
self?.beforAttachmentVc.attachmentViewModel.photoAttachments.insert(PhotoAttachmentModel(url, ATTACHMENT_TYPE.CHILD_BILL_ATTACHMENT_TYPE.rawValue, model.entityUuid, ATTACHMENT_LOCATION.ATTACHMENT_HTTP), at: kZERO)
}
if result.count > kZERO {
self?.beforAttachmentVc.setItemSize(CGSize(width: self!.imageWidth, height: self!.imageWidth),3)
self?.beforAttachmentHeight = self?.beforAttachmentVc.attachmentHeight(result.count,befor)
self?.tableView.reloadData()
}
}).disposed(by: disposeBag)
}
if !childBillViewModel.childBillDetailData.endAttachmentId.isEmpty {
childBillViewModel.downloadAafterAttachmentAction(childBillViewModel.childBillDetailData.endAttachmentId)
.subscribe(onNext: {[weak self] (result) in
for model in result {
let url = String(format: attachmentUrl, model.entityType,model.entityUuid,model.fileName)
self?.afterAttachmentVc.attachmentViewModel.photoAttachments.insert(PhotoAttachmentModel(url, ATTACHMENT_TYPE.CHILD_BILL_ATTACHMENT_TYPE.rawValue, model.entityUuid, ATTACHMENT_LOCATION.ATTACHMENT_HTTP), at: kZERO)
}
if result.count > kZERO {
self?.afterAttachmentVc.setItemSize(CGSize(width: self!.imageWidth, height: self!.imageWidth),3)
self?.afterAttachmentHeight = self?.afterAttachmentVc.attachmentHeight(result.count,after)
self?.tableView.reloadData()
}
}).disposed(by: disposeBag)
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == CHILD_BILL_DETAIL_SECTION.DESCRIBE.rawValue {
if indexPath.row == kONE {
let beforCell = tableView.dequeueReusableCell(withIdentifier: MaintainBeforAttachmentTableViewCell.name(), for: indexPath)
beforAttachmentVc.view.frame = CGRect(x: 80, y: 0, width: kWidth - 80, height: beforAttachmentHeight)
beforCell.contentView.addSubview(beforAttachmentVc.view)
beforAttachmentVc.photoAttachmentCollectionView.reloadData()
return beforCell
}
if indexPath.row == kONE * 2 {
let afterCell = tableView.dequeueReusableCell(withIdentifier: MaintainAfterAttachmentTableViewCell.name(), for: indexPath)
afterAttachmentVc.view.frame = CGRect(x: 80, y: 0, width: kWidth - 80, height: afterAttachmentHeight)
afterCell.contentView.addSubview(afterAttachmentVc.view)
afterAttachmentVc.photoAttachmentCollectionView.reloadData()
return afterCell
}
}
return super.tableView(tableView, cellForRowAt: indexPath)
}
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return kSectionZero
} }
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if section == CHILD_BILL_DETAIL_SECTION.STATE.rawValue {
return kSectionZero
}
return 35
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == CHILD_BILL_DETAIL_SECTION.DESCRIBE.rawValue {
return 3
}
return super.tableView(tableView, numberOfRowsInSection: section)
}
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if section == CHILD_BILL_DETAIL_SECTION.STATE.rawValue {
return UIView()
}
return childBillViewModel.dequeueReusableHeaderFooterView(RepairOrderDetailSectionView.name(),tableView,section)
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section == CHILD_BILL_DETAIL_SECTION.DESCRIBE.rawValue {
if indexPath.row == kZERO {
return childBillViewModel.childBillDetailData.noteHeight + 15
}
if indexPath.row == kONE {
return beforAttachmentHeight + 15
}
if indexPath.row == kONE * 2 {
return afterAttachmentHeight + 15
}
}
return super.tableView(tableView, heightForRowAt: indexPath)
}
} }
...@@ -10,6 +10,7 @@ import UIKit ...@@ -10,6 +10,7 @@ import UIKit
import RxSwift import RxSwift
import SwiftyJSON import SwiftyJSON
class RepairOrderCompletedViewController: BaseTableViewController { class RepairOrderCompletedViewController: BaseTableViewController {
/// RxSwift自动释放 /// RxSwift自动释放
...@@ -26,12 +27,21 @@ class RepairOrderCompletedViewController: BaseTableViewController { ...@@ -26,12 +27,21 @@ class RepairOrderCompletedViewController: BaseTableViewController {
return billCompleteViewModel return billCompleteViewModel
}() }()
/// 工单状态回调
var stateBlock: BillStateBlock!
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
uiConfigAction() uiConfigAction()
} }
// MARK: - 工单状态回调
func setStateBlock(_ block: @escaping BillStateBlock) {
self.stateBlock = block
}
// MARK: - UI // MARK: - UI
fileprivate func uiConfigAction() { fileprivate func uiConfigAction() {
remarkTextView.placeholder = "详细完成情况" remarkTextView.placeholder = "详细完成情况"
...@@ -49,6 +59,8 @@ class RepairOrderCompletedViewController: BaseTableViewController { ...@@ -49,6 +59,8 @@ class RepairOrderCompletedViewController: BaseTableViewController {
billCompleteViewModel.billCompltedModel.finishUser = finishModel billCompleteViewModel.billCompltedModel.finishUser = finishModel
billCompleteViewModel.complteRepairOrderAction(billCompleteViewModel.billCompltedModel).subscribe(onNext: {[weak self] () in billCompleteViewModel.complteRepairOrderAction(billCompleteViewModel.billCompltedModel).subscribe(onNext: {[weak self] () in
ShowMessage("完成成功") ShowMessage("完成成功")
self?.stateBlock(SUBMIT_REPAIR_ORDER_STATE.FINISHED.rawValue)
NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: UPDATE_BILL_DETAIL_LIST)))
self?.popVC() self?.popVC()
}).disposed(by: disposeBag) }).disposed(by: disposeBag)
} }
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
import UIKit import UIKit
import SnapKit import SnapKit
import SwiftyJSON import SwiftyJSON
import RxSwift
class RepairOrderDetailBgController: BaseViewController { class RepairOrderDetailBgController: BaseViewController {
...@@ -28,6 +29,16 @@ class RepairOrderDetailBgController: BaseViewController { ...@@ -28,6 +29,16 @@ class RepairOrderDetailBgController: BaseViewController {
var detailVc = RepairOrderDetailViewController.instantiateViewController(.Function) as! RepairOrderDetailViewController var detailVc = RepairOrderDetailViewController.instantiateViewController(.Function) as! RepairOrderDetailViewController
return detailVc return detailVc
}() }()
/// RxSwift自动释放
let disposeBag = DisposeBag()
/// 悬浮View
var suspendView: RepairOrderDetailSuspendView?
/// 工单详情ViewModel
lazy final var orderDetailViewModel: RepairOrderDetailViewModel = {
var orderDetailViewModel = RepairOrderDetailViewModel()
return orderDetailViewModel
}()
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
...@@ -44,20 +55,19 @@ class RepairOrderDetailBgController: BaseViewController { ...@@ -44,20 +55,19 @@ class RepairOrderDetailBgController: BaseViewController {
} }
addChildViewController(detailVc) addChildViewController(detailVc)
detailVc.setStateBlock {[weak self] (state) in detailVc.setStateBlock {[weak self] (state) in
/* self?.rapairBillBottomViewAction(state)
/// - FINISHED: 已完成 }
/// - DELETED: 已删除 detailVc.setSuspendViewAlphaBlock {[weak self] (alpha) in
/// - CANCLED self?.suspendView?.alpha = alpha
*/ }
if state == SUBMIT_REPAIR_ORDER_STATE.FINISHED.rawValue || state == SUBMIT_REPAIR_ORDER_STATE.DELETED.rawValue || state == SUBMIT_REPAIR_ORDER_STATE.CANCLED.rawValue { detailVc.setSuspendViewStateBlock {[weak self] (model, indexPath,state) in
self?.bottomLayoutHeight.constant = 0 if state == SUBMIT_REPAIR_ORDER_STATE.INIT.rawValue {
UIView.animate(withDuration: 0.5, animations: { self?.setupSuspendViewAction(model,indexPath)
self?.view.layoutIfNeeded()
})
}else { }else {
self?.bottomLayoutHeight.constant = 50 UIView.animate(withDuration: kAnimationTime, animations: {
UIView.animate(withDuration: 0.5, animations: { self?.suspendView?.seth(h: kHeight)
self?.view.layoutIfNeeded() }, completion: { (bool) in
self?.suspendView?.removeFromSuperview()
}) })
} }
} }
...@@ -72,17 +82,45 @@ class RepairOrderDetailBgController: BaseViewController { ...@@ -72,17 +82,45 @@ class RepairOrderDetailBgController: BaseViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == RepairOrderCompletedViewController.name() { if segue.identifier == RepairOrderCompletedViewController.name() {
let completeVc = segue.destination as! RepairOrderCompletedViewController let completeVc = segue.destination as! RepairOrderCompletedViewController
let model = BillCompletedRequestModel.init(fromJson: JSON(detailVc.orderDetailViewModel.billDetailModel.toDictionary())) let model = BillCompletedRequestModel(fromJson: JSON(detailVc.orderDetailViewModel.billDetailModel.toDictionary()))
completeVc.setStateBlock({[weak self] (state) in
self?.rapairBillBottomViewAction(state)
})
completeVc.billCompleteViewModel.billCompltedModel = model completeVc.billCompleteViewModel.billCompltedModel = model
} }
} }
}
// MARK: - 工单底部view
fileprivate func rapairBillBottomViewAction(_ state: String) {
if state == SUBMIT_REPAIR_ORDER_STATE.FINISHED.rawValue || state == SUBMIT_REPAIR_ORDER_STATE.DELETED.rawValue || state == SUBMIT_REPAIR_ORDER_STATE.CANCLED.rawValue {
bottomLayoutHeight.constant = 0
UIView.animate(withDuration: kAnimationTime, animations: {
self.view.layoutIfNeeded()
})
}else {
bottomLayoutHeight.constant = 50
UIView.animate(withDuration: kAnimationTime, animations: {
self.view.layoutIfNeeded()
})
}
}
// MARK: - 设置悬浮框
fileprivate func setupSuspendViewAction(_ model: BillDetailExecute, _ indexPath: IndexPath) {
let suspendView = RepairOrderDetailSuspendView.instantiateFromNib() as! RepairOrderDetailSuspendView
suspendView.updateSuspendView(model, indexPath)
suspendView.frame = CGRect(x: 15, y: kHeight, width: kWidth - 30, height: 60)
self.suspendView = suspendView
self.view.addSubview(suspendView)
self.view.bringSubview(toFront: suspendView)
UIView.animate(withDuration: kAnimationTime, animations: {
suspendView.sety(y: self.view.height - kNavHeight - kTabBarHeight)
})
suspendView.operationOrderBtn.rx.controlEvent(UIControlEvents.touchUpInside).subscribe(onNext: {[weak self] (event) in
self?.detailVc.suspendViewButtonClickAction(suspendView.operationOrderBtn.currentTitle!,model,indexPath)
}).disposed(by: disposeBag)
}
}
...@@ -23,7 +23,6 @@ class RepairOrderEditSonOrderViewController: BaseTableViewController { ...@@ -23,7 +23,6 @@ class RepairOrderEditSonOrderViewController: BaseTableViewController {
var afterAttachmentHeight: CGFloat! = 0 var afterAttachmentHeight: CGFloat! = 0
/// 工单数据 /// 工单数据
open var billModel: BillDetailExecute! open var billModel: BillDetailExecute!
/// 主管指引、备件、工具 /// 主管指引、备件、工具
@IBOutlet weak var toolOptionLabel: UILabel! @IBOutlet weak var toolOptionLabel: UILabel!
/// 安全、防护、围封、环保 /// 安全、防护、围封、环保
...@@ -44,7 +43,6 @@ class RepairOrderEditSonOrderViewController: BaseTableViewController { ...@@ -44,7 +43,6 @@ class RepairOrderEditSonOrderViewController: BaseTableViewController {
@IBOutlet weak var materialCostLabel: UILabel! @IBOutlet weak var materialCostLabel: UILabel!
/// 描述 /// 描述
@IBOutlet weak var describeTextView: IQTextView! @IBOutlet weak var describeTextView: IQTextView!
/// 维修前图片附件 /// 维修前图片附件
lazy final var beforAttachmentVc: PhotoAttachmentViewController = { lazy final var beforAttachmentVc: PhotoAttachmentViewController = {
var attachmentVc = PhotoAttachmentViewController.instantiateViewController(.Function) as! PhotoAttachmentViewController var attachmentVc = PhotoAttachmentViewController.instantiateViewController(.Function) as! PhotoAttachmentViewController
...@@ -65,26 +63,20 @@ class RepairOrderEditSonOrderViewController: BaseTableViewController { ...@@ -65,26 +63,20 @@ class RepairOrderEditSonOrderViewController: BaseTableViewController {
return childBillViewModel return childBillViewModel
}() }()
/// 主工单详情ViewModel
lazy final var orderDetailViewModel: RepairOrderDetailViewModel = {
var orderDetailViewModel = RepairOrderDetailViewModel()
return orderDetailViewModel
}()
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
uiConfigAction()
setupTableView() setupTableView()
setupPhotoAttachmentVc() setupPhotoAttachmentVc()
getBillDetailAction() getBillDetailAction()
bindingRxAction()
} }
// MARK: - 获取子工单详情 // MARK: - UI
fileprivate func getBillDetailAction() { fileprivate func uiConfigAction() {
orderDetailViewModel.billDetailModel = BillDetailData(billModel.state) describeTextView.placeholder = "描述"
orderDetailViewModel.queryRepairOrderDetailAction(billModel.uuid).subscribe {[weak self] (event) in describeTextView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0)
self?.tableView.reloadData()
}.disposed(by: disposeBag)
} }
// MARK: - 设置附件VC // MARK: - 设置附件VC
...@@ -97,26 +89,107 @@ class RepairOrderEditSonOrderViewController: BaseTableViewController { ...@@ -97,26 +89,107 @@ class RepairOrderEditSonOrderViewController: BaseTableViewController {
beforAttachmentHeight = beforAttachmentVc.attachmentHeight(kONE,befor) beforAttachmentHeight = beforAttachmentVc.attachmentHeight(kONE,befor)
} }
// MARK: - 绑定RxSwift事件
fileprivate func bindingRxAction() {
costLaborText.rx.text.subscribe(onNext: {[weak self] (string) in
self?.childBillViewModel.childBillDetailData.labourfee = string
}).disposed(by: disposeBag)
describeTextView.rx.text.subscribe(onNext: {[weak self] (string) in
self?.childBillViewModel.childBillDetailData.note = string
}).disposed(by: disposeBag)
}
// MARK: - 获取子工单详情
fileprivate func getBillDetailAction() {
childBillViewModel.queryChildBillDetailAction(billModel.uuid).subscribe {[weak self] (event) in
self?.childBillViewModel.childBillDetailAssignment(self!)
self?.disposeAttachment()
}.disposed(by: disposeBag)
}
// MARK: - 获取图片附件通过entity uuid
fileprivate func disposeAttachment() {
if !childBillViewModel.childBillDetailData.beginAttachmentId.isEmpty {
childBillViewModel.downloadBeforAttachmentAction(childBillViewModel.childBillDetailData.beginAttachmentId)
.subscribe(onNext: {[weak self] (result) in
for model in result {
let url = String(format: attachmentUrl, model.entityType,model.entityUuid,model.fileName)
self?.beforAttachmentVc.attachmentViewModel.photoAttachments.insert(PhotoAttachmentModel(url, ATTACHMENT_TYPE.CHILD_BILL_ATTACHMENT_TYPE.rawValue, model.entityUuid, ATTACHMENT_LOCATION.ATTACHMENT_HTTP), at: kZERO)
}
self?.beforAttachmentHeight = self?.beforAttachmentVc.attachmentHeight(result.count + kONE,befor)
self?.tableView.reloadData()
}).disposed(by: disposeBag)
}
if !childBillViewModel.childBillDetailData.endAttachmentId.isEmpty {
childBillViewModel.downloadAafterAttachmentAction(childBillViewModel.childBillDetailData.endAttachmentId)
.subscribe(onNext: {[weak self] (result) in
for model in result {
let url = String(format: attachmentUrl, model.entityType,model.entityUuid,model.fileName)
self?.afterAttachmentVc.attachmentViewModel.photoAttachments.insert(PhotoAttachmentModel(url, ATTACHMENT_TYPE.CHILD_BILL_ATTACHMENT_TYPE.rawValue, model.entityUuid, ATTACHMENT_LOCATION.ATTACHMENT_HTTP), at: kZERO)
}
self?.afterAttachmentHeight = self?.afterAttachmentVc.attachmentHeight(result.count + kONE,after)
self?.tableView.reloadData()
}).disposed(by: disposeBag)
}
}
// MARK: - TableView // MARK: - TableView
fileprivate func setupTableView() { fileprivate func setupTableView() {
tableView.register(RepairAfterAttachmentTableViewCell.classForCoder(), forCellReuseIdentifier: RepairAfterAttachmentTableViewCell.name()) tableView.register(RepairAfterAttachmentTableViewCell.classForCoder(), forCellReuseIdentifier: RepairAfterAttachmentTableViewCell.name())
tableView.register(RepairBeforAttachmentTableViewCell.classForCoder(), forCellReuseIdentifier: RepairBeforAttachmentTableViewCell.name()) tableView.register(RepairBeforAttachmentTableViewCell.classForCoder(), forCellReuseIdentifier: RepairBeforAttachmentTableViewCell.name())
let completeView = RepairOrderEditSonOrderCompleteView.instantiateFromNib() as! RepairOrderEditSonOrderCompleteView let completeView = RepairOrderEditSonOrderCompleteView.instantiateFromNib() as! RepairOrderEditSonOrderCompleteView
//完成子工单
completeView.completeBtn.rx.controlEvent(UIControlEvents.touchUpInside).subscribe(onNext: {[weak self] (event) in completeView.completeBtn.rx.controlEvent(UIControlEvents.touchUpInside).subscribe(onNext: {[weak self] (event) in
self?.gotoChildBillDetailVc() self?.uploadActtachmentAction().subscribe(onNext: {[weak self] (result) in
self?.childBillViewModel.finishChildBillAction().subscribe(onNext: { () in
ShowMessage("子工单完成")
NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: UPDATE_BILL_DETAIL_LIST)))
self?.popVC()
}).disposed(by: self!.disposeBag)
}).disposed(by: self!.disposeBag)
}).disposed(by: disposeBag) }).disposed(by: disposeBag)
tableView.tableFooterView = completeView tableView.tableFooterView = completeView
navigationItem.rightBarButtonItem = createButtonItem("保存", nil, self, #selector(RepairOrderEditSonOrderViewController.saveButtonClickAction)) navigationItem.rightBarButtonItem = createButtonItem("保存", nil, self, #selector(RepairOrderEditSonOrderViewController.saveButtonClickAction))
} }
// MARK: - 提交、保存工单 // MARK: - 提交、保存工单
@objc fileprivate func saveButtonClickAction() { @objc fileprivate func saveButtonClickAction() {
childBillViewModel.saveChildBillAction().subscribe(onNext: {[weak self] () in uploadActtachmentAction().subscribe(onNext: {[weak self] (result) in
self?.childBillViewModel.saveChildBillAction().subscribe(onNext: { () in
ShowMessage("保存成功") ShowMessage("保存成功")
self?.popVC() self?.popVC()
}).disposed(by: self!.disposeBag)
}).disposed(by: disposeBag) }).disposed(by: disposeBag)
} }
// MARK: - 上传附件
fileprivate func uploadActtachmentAction() ->Observable<(Void,Void)> {
var beforFileUrlArray = Array<UploadPhotoAttachmentModel>()
let beforEntityUuid = childBillViewModel.childBillDetailData.beginAttachmentId!
for i in 0..<beforAttachmentVc.attachmentViewModel.photoAttachments.count - kONE {
let image = beforAttachmentVc.attachmentViewModel.photoAttachments[i]
if image.attachmentType == ATTACHMENT_LOCATION.ATTACHMENT_LOCAL {
let imageName = randomMD5()
let fileUrl = saveImage(currentImage: image.attachment as! UIImage, persent: 0.8, imageName: imageName + ".jpg")
let model = UploadPhotoAttachmentModel(imageName, fileUrl, ATTACHMENT_TYPE.CHILD_BILL_ATTACHMENT_TYPE.rawValue, beforEntityUuid)
beforFileUrlArray.append(model)
}
}
var afterFileUrlArray = Array<UploadPhotoAttachmentModel>()
let afterEntityUuid = childBillViewModel.childBillDetailData.endAttachmentId!
for i in 0..<afterAttachmentVc.attachmentViewModel.photoAttachments.count - kONE {
let image = afterAttachmentVc.attachmentViewModel.photoAttachments[i]
if image.attachmentType == ATTACHMENT_LOCATION.ATTACHMENT_LOCAL {
let imageName = randomMD5()
let fileUrl = saveImage(currentImage: image.attachment as! UIImage, persent: 0.8, imageName: imageName + ".jpg")
let model = UploadPhotoAttachmentModel(imageName, fileUrl, ATTACHMENT_TYPE.CHILD_BILL_ATTACHMENT_TYPE.rawValue, afterEntityUuid)
afterFileUrlArray.append(model)
}
}
return childBillViewModel.childBillUploadAttachmentAction(beforFileUrlArray, afterFileUrlArray)
}
// MARK: - 跳转子工单详情 // MARK: - 跳转子工单详情
fileprivate func gotoChildBillDetailVc() { fileprivate func gotoChildBillDetailVc() {
self.performSegue(withIdentifier: RepairOrderChildBillDetailViewController.name(), sender: nil) self.performSegue(withIdentifier: RepairOrderChildBillDetailViewController.name(), sender: nil)
...@@ -128,12 +201,14 @@ class RepairOrderEditSonOrderViewController: BaseTableViewController { ...@@ -128,12 +201,14 @@ class RepairOrderEditSonOrderViewController: BaseTableViewController {
let beforCell = tableView.dequeueReusableCell(withIdentifier: RepairBeforAttachmentTableViewCell.name(), for: indexPath) let beforCell = tableView.dequeueReusableCell(withIdentifier: RepairBeforAttachmentTableViewCell.name(), for: indexPath)
beforAttachmentVc.view.frame = CGRect(x: 15, y: 8, width: kWidth - 30, height: beforAttachmentHeight) beforAttachmentVc.view.frame = CGRect(x: 15, y: 8, width: kWidth - 30, height: beforAttachmentHeight)
beforCell.contentView.addSubview(beforAttachmentVc.view) beforCell.contentView.addSubview(beforAttachmentVc.view)
beforAttachmentVc.photoAttachmentCollectionView.reloadData()
return beforCell return beforCell
} }
if indexPath.section == CHILD_BILL_EDIT_SECTION.AFTERATTACHMENT.rawValue { if indexPath.section == CHILD_BILL_EDIT_SECTION.AFTERATTACHMENT.rawValue {
let afterCell = tableView.dequeueReusableCell(withIdentifier: RepairAfterAttachmentTableViewCell.name(), for: indexPath) let afterCell = tableView.dequeueReusableCell(withIdentifier: RepairAfterAttachmentTableViewCell.name(), for: indexPath)
afterAttachmentVc.view.frame = CGRect(x: 15, y: 8, width: kWidth - 30, height: afterAttachmentHeight) afterAttachmentVc.view.frame = CGRect(x: 15, y: 8, width: kWidth - 30, height: afterAttachmentHeight)
afterCell.contentView.addSubview(afterAttachmentVc.view) afterCell.contentView.addSubview(afterAttachmentVc.view)
afterAttachmentVc.photoAttachmentCollectionView.reloadData()
return afterCell return afterCell
} }
return super.tableView(tableView, cellForRowAt: indexPath) return super.tableView(tableView, cellForRowAt: indexPath)
......
...@@ -36,6 +36,7 @@ class RepairOrderViewController: BaseTableViewPullController { ...@@ -36,6 +36,7 @@ class RepairOrderViewController: BaseTableViewPullController {
uiConfigAction() uiConfigAction()
bindingRxAction() bindingRxAction()
noticeRefreshDataAction()
} }
// MARK: - UI // MARK: - UI
...@@ -45,10 +46,10 @@ class RepairOrderViewController: BaseTableViewPullController { ...@@ -45,10 +46,10 @@ class RepairOrderViewController: BaseTableViewPullController {
stateChooseButton.addBorder(1.0, kGaryColor) stateChooseButton.addBorder(1.0, kGaryColor)
sourceChooseButton.addBorder(1.0, kGaryColor) sourceChooseButton.addBorder(1.0, kGaryColor)
priorityChooseButton.addBorder(1.0, kGaryColor) priorityChooseButton.addBorder(1.0, kGaryColor)
dateChooseButton.horizontalCenterTitleAndImageRight(5) dateChooseButton.horizontalCenterTitleAndImage(5)
stateChooseButton.horizontalCenterTitleAndImageRight(5) stateChooseButton.horizontalCenterTitleAndImage(5)
sourceChooseButton.horizontalCenterTitleAndImageRight(5) sourceChooseButton.horizontalCenterTitleAndImage(5)
priorityChooseButton.horizontalCenterTitleAndImageRight(5) priorityChooseButton.horizontalCenterTitleAndImage(5)
} }
// MARK: - 绑定RxSwift事件 // MARK: - 绑定RxSwift事件
...@@ -86,13 +87,22 @@ class RepairOrderViewController: BaseTableViewPullController { ...@@ -86,13 +87,22 @@ class RepairOrderViewController: BaseTableViewPullController {
}).disposed(by: disposeBag) }).disposed(by: disposeBag)
} }
// MARK: - 通知刷新数据
func noticeRefreshDataAction() {
NotificationCenter.default.rx.notification(Notification.Name(rawValue: UPDATE_BILL_LIST)).subscribe(onNext: {[weak self] (notice) in
self?.pullPageIndex = kZERO
self?.repairOrderViewModel.queryModel.endCreateTime = NSDate().httpParameterString()
self?.loadWebDataSource()
}).disposed(by: disposeBag)
}
// MARK: - 加载数据 // MARK: - 加载数据
override func loadWebDataSource() { override func loadWebDataSource() {
repairOrderViewModel.queryModel.page = pullPageIndex repairOrderViewModel.queryModel.page = pullPageIndex
repairOrderViewModel.queryRepairOrderAction().subscribe {[weak self] (event) in repairOrderViewModel.queryRepairOrderAction().subscribe {[weak self] (event) in
switch event { switch event {
case .next(let page): case .next(let page):
if (self?.pullPageIndex)! >= page { if (self?.pullPageIndex)! >= page - kONE {
self?.endRefreshNomoreData() self?.endRefreshNomoreData()
}else { }else {
self?.endRefresh() self?.endRefresh()
......
//
// ChildBillDetailResultModel.swift
//
// Create by 云霄 曹 on 16/1/2018
// Copyright © 2018. All rights reserved.
import Foundation
import SwiftyJSON
class ChildBillDetailResultModel : NSObject{
var data : ChildBillDetailData!
var message : String!
var success : Bool!
/**
* Instantiate the instance using the passed json values to set the properties values
*/
init(fromJson json: JSON!){
if json.isEmpty{
return
}
let dataJson = json["data"]
if !dataJson.isEmpty{
data = ChildBillDetailData(fromJson: dataJson)
}
message = json["message"].stringValue
success = json["success"].boolValue
}
/**
* Returns all the available property values in the form of [String:Any] object where the key is the approperiate json key and the value is the value of the corresponding property
*/
func toDictionary() -> [String:Any]
{
var dictionary = [String:Any]()
if data != nil{
dictionary["data"] = data.toDictionary()
}
if message != nil{
dictionary["message"] = message
}
if success != nil{
dictionary["success"] = success
}
return dictionary
}
}
open class ChildBillDetailData : NSObject{
var beginAttachmentId : String!
var createId : String!
var createOperName : String!
var createTime : String!
var dept : UCN!
var endAttachmentId : String!
// var executeMateriels : [AnyObject]!
var executeNo : String!
// var executeOutsources : [AnyObject]!
var hasOut : Bool!
var hasPaid : Bool!
var labourfee : String!
var lastModifyId : String!
var lastModifyOperName : String!
var lastModifyTime : String!
var materielfee : String!
var note : String!
var noteHeight : CGFloat! = 30
var owner : UCN!
var ownerTime : String!
var processBegin : String!
var processEnd : String!
var processMode : String!
var processor : String!
var property1 : String!
var property2 : String!
var reason : String!
var state : String!
var uuid : String!
var version : Int!
var workid : String!
init(_ state: String) {
self.state = state
}
/**
* Instantiate the instance using the passed json values to set the properties values
*/
init(fromJson json: JSON!){
if json.isEmpty{
return
}
beginAttachmentId = json["beginAttachmentId"].stringValue
createId = json["create_id"].stringValue
createOperName = json["create_operName"].stringValue
createTime = json["create_time"].stringValue
let deptJson = json["dept"]
if !deptJson.isEmpty{
dept = UCN(fromJson: deptJson)
}
endAttachmentId = json["endAttachmentId"].stringValue
executeNo = json["executeNo"].stringValue
hasOut = json["hasOut"].boolValue
hasPaid = json["hasPaid"].boolValue
labourfee = json["labourfee"].stringValue
lastModifyId = json["lastModify_id"].stringValue
lastModifyOperName = json["lastModify_operName"].stringValue
lastModifyTime = json["lastModify_time"].stringValue
materielfee = json["materielfee"].stringValue
note = json["note"].stringValue
noteHeight = note.calculateStringSize(CGSize(width: kWidth - 105, height: CGFloat.greatestFiniteMagnitude), font: UIFont.systemFont(ofSize: 13)).height
let ownerJson = json["owner"]
if !ownerJson.isEmpty{
owner = UCN(fromJson: ownerJson)
}
ownerTime = json["ownerTime"].stringValue
processBegin = json["processBegin"].stringValue
processEnd = json["processEnd"].stringValue
processMode = json["processMode"].stringValue
processor = json["processor"].stringValue
property1 = json["property1"].stringValue
property2 = json["property2"].stringValue
reason = json["reason"].stringValue
state = json["state"].stringValue
uuid = json["uuid"].stringValue
version = json["version"].intValue
workid = json["workid"].stringValue
}
/**
* Returns all the available property values in the form of [String:Any] object where the key is the approperiate json key and the value is the value of the corresponding property
*/
func toDictionary() -> [String:Any]
{
var dictionary = [String:Any]()
if beginAttachmentId != nil{
dictionary["beginAttachmentId"] = beginAttachmentId
}
if createId != nil{
dictionary["create_id"] = createId
}
if createOperName != nil{
dictionary["create_operName"] = createOperName
}
if createTime != nil{
dictionary["create_time"] = createTime
}
if dept != nil{
dictionary["dept"] = dept.toDictionary()
}
if endAttachmentId != nil{
dictionary["endAttachmentId"] = endAttachmentId
}
// if !executeMateriels.isEmpty {
// dictionary["executeMateriels"] = executeMateriels
// }
if executeNo != nil{
dictionary["executeNo"] = executeNo
}
// if !executeOutsources.isEmpty {
// dictionary["executeOutsources"] = executeOutsources
// }
if hasOut != nil{
dictionary["hasOut"] = hasOut
}
if hasPaid != nil{
dictionary["hasPaid"] = hasPaid
}
if labourfee != nil{
dictionary["labourfee"] = labourfee
}
if lastModifyId != nil{
dictionary["lastModify_id"] = lastModifyId
}
if lastModifyOperName != nil{
dictionary["lastModify_operName"] = lastModifyOperName
}
if lastModifyTime != nil{
dictionary["lastModify_time"] = lastModifyTime
}
if materielfee != nil{
dictionary["materielfee"] = materielfee
}
if note != nil{
dictionary["note"] = note
}
if owner != nil{
dictionary["owner"] = owner.toDictionary()
}
if ownerTime != nil{
dictionary["ownerTime"] = ownerTime
}
if processBegin != nil{
dictionary["processBegin"] = processBegin
}
if processEnd != nil{
dictionary["processEnd"] = processEnd
}
if processMode != nil{
dictionary["processMode"] = processMode
}
if processor != nil{
dictionary["processor"] = processor
}
if property1 != nil{
dictionary["property1"] = property1
}
if property2 != nil{
dictionary["property2"] = property2
}
if reason != nil{
dictionary["reason"] = reason
}
if state != nil{
dictionary["state"] = state
}
if uuid != nil{
dictionary["uuid"] = uuid
}
if version != nil{
dictionary["version"] = version
}
if workid != nil{
dictionary["workid"] = workid
}
return dictionary
}
}
...@@ -18,18 +18,18 @@ open class ChildBillSaveOrUpdateModel : NSObject{ ...@@ -18,18 +18,18 @@ open class ChildBillSaveOrUpdateModel : NSObject{
var executeOutsources : [AnyObject]! var executeOutsources : [AnyObject]!
var hasOut : Bool! var hasOut : Bool!
var hasPaid : Bool! var hasPaid : Bool!
var labourfee : AnyObject! var labourfee : String!
var materielfee : Int! var materielfee : Int!
var note : AnyObject! var note : String!
var owner : AnyObject! var owner : String!
var ownerTime : AnyObject! var ownerTime : String!
var processBegin : AnyObject! var processBegin : String!
var processEnd : AnyObject! var processEnd : String!
var processMode : AnyObject! var processMode : String!
var processor : AnyObject! var processor : String!
var property1 : AnyObject! var property1 : String!
var property2 : AnyObject! var property2 : String!
var reason : AnyObject! var reason : String!
var state : String! var state : String!
var workid : String! var workid : String!
......
...@@ -64,6 +64,7 @@ open class BillDetailData : NSObject{ ...@@ -64,6 +64,7 @@ open class BillDetailData : NSObject{
var createOperName : String! var createOperName : String!
var createTime : String! var createTime : String!
var descriptionField : String! var descriptionField : String!
var descriptionFieldHeight: CGFloat! = 10
var device : UCN! var device : UCN!
var deviceType : AnyObject! var deviceType : AnyObject!
var deviceadree : String! var deviceadree : String!
...@@ -97,6 +98,7 @@ open class BillDetailData : NSObject{ ...@@ -97,6 +98,7 @@ open class BillDetailData : NSObject{
var workNo : String! var workNo : String!
init(_ state: String) { init(_ state: String) {
self.state = state self.state = state
} }
...@@ -118,6 +120,7 @@ open class BillDetailData : NSObject{ ...@@ -118,6 +120,7 @@ open class BillDetailData : NSObject{
createOperName = json["create_operName"].stringValue createOperName = json["create_operName"].stringValue
createTime = json["create_time"].stringValue createTime = json["create_time"].stringValue
descriptionField = json["description"].stringValue descriptionField = json["description"].stringValue
descriptionFieldHeight = descriptionField.calculateStringSize(CGSize(width: kWidth - 105, height: CGFloat.greatestFiniteMagnitude), font: UIFont.systemFont(ofSize: 13)).height
let deviceJson = json["device"] let deviceJson = json["device"]
if !deviceJson.isEmpty{ if !deviceJson.isEmpty{
device = UCN(fromJson: deviceJson) device = UCN(fromJson: deviceJson)
...@@ -311,7 +314,7 @@ open class BillDetailData : NSObject{ ...@@ -311,7 +314,7 @@ open class BillDetailData : NSObject{
} }
class BillDetailExecute : NSObject{ open class BillDetailExecute : NSObject{
var beginAttachmentId : String! var beginAttachmentId : String!
var beginAttachments : AnyObject! var beginAttachments : AnyObject!
......
//
// MaintainAfterAttachmentTableViewCell.swift
// IFS
//
// Created by 曹云霄 on 2018/1/16.
// Copyright © 2018年 上海勾芒信息科技有限公司. All rights reserved.
//
import UIKit
class MaintainAfterAttachmentTableViewCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" rowHeight="91" id="KGk-i7-Jjw" customClass="MaintainAfterAttachmentTableViewCell" customModule="IFS" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="320" height="91"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
<rect key="frame" x="0.0" y="0.0" width="320" height="90.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="维修后" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="j4V-Po-dFb">
<rect key="frame" x="15" y="5" width="40" height="16"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="j4V-Po-dFb" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="5" id="oDg-hH-JZD"/>
<constraint firstItem="j4V-Po-dFb" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="15" id="utU-tL-C0b"/>
</constraints>
</tableViewCellContentView>
<viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
<point key="canvasLocation" x="25" y="28.5"/>
</tableViewCell>
</objects>
</document>
//
// MaintainBeforAttachmentTableViewCell.swift
// IFS
//
// Created by 曹云霄 on 2018/1/16.
// Copyright © 2018年 上海勾芒信息科技有限公司. All rights reserved.
//
import UIKit
class MaintainBeforAttachmentTableViewCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" rowHeight="90" id="KGk-i7-Jjw" customClass="MaintainBeforAttachmentTableViewCell" customModule="IFS" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="320" height="90"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
<rect key="frame" x="0.0" y="0.0" width="320" height="89.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="维修前" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IBZ-p5-QTS">
<rect key="frame" x="15" y="5" width="40" height="16"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="IBZ-p5-QTS" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="5" id="aZY-sE-ET4"/>
<constraint firstItem="IBZ-p5-QTS" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="15" id="uNv-wU-GyU"/>
</constraints>
</tableViewCellContentView>
<viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
<point key="canvasLocation" x="-102" y="-17"/>
</tableViewCell>
</objects>
</document>
//
// RepairOrderAttachmentTableViewCell.swift
// IFS
//
// Created by 曹云霄 on 2018/1/16.
// Copyright © 2018年 上海勾芒信息科技有限公司. All rights reserved.
//
import UIKit
class RepairOrderAttachmentTableViewCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" rowHeight="97" id="KGk-i7-Jjw" customClass="RepairOrderAttachmentTableViewCell" customModule="IFS" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="320" height="97"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
<rect key="frame" x="0.0" y="0.0" width="320" height="96.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="照片描述" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="BEL-rn-e0r">
<rect key="frame" x="15" y="5" width="53.5" height="16"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="BEL-rn-e0r" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" constant="5" id="bAU-m8-NXD"/>
<constraint firstItem="BEL-rn-e0r" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="15" id="egr-iP-at2"/>
</constraints>
</tableViewCellContentView>
<viewLayoutGuide key="safeArea" id="njF-e1-oar"/>
<point key="canvasLocation" x="-72" y="20"/>
</tableViewCell>
</objects>
</document>
...@@ -25,8 +25,8 @@ ...@@ -25,8 +25,8 @@
<fontDescription key="fontDescription" type="system" pointSize="13"/> <fontDescription key="fontDescription" type="system" pointSize="13"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="2018-01-08 10:50:32" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Yca-g4-cKt"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Yca-g4-cKt">
<rect key="frame" x="230" y="10" width="130" height="16"/> <rect key="frame" x="360" y="18" width="0.0" height="0.0"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/> <fontDescription key="fontDescription" type="system" pointSize="13"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
......
...@@ -19,8 +19,13 @@ class RepairOrderDetailSuspendView: UIView { ...@@ -19,8 +19,13 @@ class RepairOrderDetailSuspendView: UIView {
/// 部门 /// 部门
@IBOutlet weak var departmentLab: UILabel! @IBOutlet weak var departmentLab: UILabel!
/// 转交时间 /// 转交时间
@IBOutlet weak var operationTimeLab: UIView! @IBOutlet weak var operationTimeLab: UILabel!
/// 数据源
var model: BillDetailExecute!
/// 悬浮框对应数据下标
var indexPath: IndexPath!
override func awakeFromNib() { override func awakeFromNib() {
super.awakeFromNib() super.awakeFromNib()
...@@ -33,4 +38,33 @@ class RepairOrderDetailSuspendView: UIView { ...@@ -33,4 +38,33 @@ class RepairOrderDetailSuspendView: UIView {
addShadow(UIColor.black) addShadow(UIColor.black)
contentBgView.addAngle(5.0) contentBgView.addAngle(5.0)
} }
// MARK: - 更新悬浮框
func updateSuspendView(_ model: BillDetailExecute, _ indexPath: IndexPath) {
self.model = model
self.indexPath = indexPath
orderStateLab.text = repairOrderChineseState(model.state)
operationTimeLab.text = model.lastModifyTime
departmentLab.text = model.dept.name
switch model.state {
case SUBMIT_REPAIR_ORDER_STATE.DREW.rawValue:
operationOrderBtn.setTitle(SUSPEND_BUTTON_TYPE.GET.rawValue, for: .normal)
operationOrderBtn.backgroundColor = kBlueColor
break
case SUBMIT_REPAIR_ORDER_STATE.DONE.rawValue:
operationOrderBtn.setTitle(SUSPEND_BUTTON_TYPE.COMPLETED.rawValue, for: .normal)
operationOrderBtn.backgroundColor = kYellowColor
break
default:
break
}
}
} }
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
<outlet property="contentBgView" destination="Mq2-FF-B2L" id="4Ue-ir-jtf"/> <outlet property="contentBgView" destination="Mq2-FF-B2L" id="4Ue-ir-jtf"/>
<outlet property="departmentLab" destination="9hT-Fx-col" id="MzW-Dg-7Kj"/> <outlet property="departmentLab" destination="9hT-Fx-col" id="MzW-Dg-7Kj"/>
<outlet property="operationOrderBtn" destination="4Ae-kJ-XQN" id="vln-FL-YrN"/> <outlet property="operationOrderBtn" destination="4Ae-kJ-XQN" id="vln-FL-YrN"/>
<outlet property="operationTimeLab" destination="Mq2-FF-B2L" id="Chc-GC-zj8"/> <outlet property="operationTimeLab" destination="kFy-ui-f5T" id="SWv-v5-GAt"/>
<outlet property="orderStateLab" destination="Ozr-71-Z31" id="9SP-Yx-cRB"/> <outlet property="orderStateLab" destination="Ozr-71-Z31" id="9SP-Yx-cRB"/>
</connections> </connections>
<point key="canvasLocation" x="33.5" y="231"/> <point key="canvasLocation" x="33.5" y="231"/>
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yB3-AZ-0Kg"> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yB3-AZ-0Kg">
<rect key="frame" x="0.0" y="0.0" width="375" height="49"/> <rect key="frame" x="0.0" y="0.0" width="375" height="49"/>
<color key="backgroundColor" red="0.99215686274509807" green="0.61568627450980395" blue="0.30980392156862746" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color key="backgroundColor" red="0.99215686274509807" green="0.61568627450980395" blue="0.30980392156862746" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="15"/> <fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
<state key="normal" title="完成"> <state key="normal" title="完成">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state> </state>
......
...@@ -55,6 +55,10 @@ extension RepairOrderAddViewModel { ...@@ -55,6 +55,10 @@ extension RepairOrderAddViewModel {
ShowMessage("请选择工单指定时间") ShowMessage("请选择工单指定时间")
return false return false
} }
guard saveOrderModel.reporterPhone != nil else {
ShowMessage("请输入报事人电话")
return false
}
guard saveOrderModel.position != nil else { guard saveOrderModel.position != nil else {
ShowMessage("请选择工单指定位置") ShowMessage("请选择工单指定位置")
return false return false
...@@ -97,6 +101,10 @@ extension RepairOrderAddViewModel { ...@@ -97,6 +101,10 @@ extension RepairOrderAddViewModel {
switch indexPath { switch indexPath {
case IndexPath(row: 0, section: 0): case IndexPath(row: 0, section: 0):
filterViewModel.queryProjectSponsors().subscribe(onNext: {[weak self] (result) in filterViewModel.queryProjectSponsors().subscribe(onNext: {[weak self] (result) in
if result.isEmpty {
ShowMessage("无数据")
return
}
YXPickerManager.share().showGeneralPickerView(kMainColor, dataArray: result, defaultString: controller.sourceLabel.text, commit: { (text, index) in YXPickerManager.share().showGeneralPickerView(kMainColor, dataArray: result, defaultString: controller.sourceLabel.text, commit: { (text, index) in
controller.sourceLabel.text = text controller.sourceLabel.text = text
controller.sourceLabel.textColor = kBlackColor controller.sourceLabel.textColor = kBlackColor
...@@ -106,6 +114,10 @@ extension RepairOrderAddViewModel { ...@@ -106,6 +114,10 @@ extension RepairOrderAddViewModel {
break break
case IndexPath(row: 1, section: 0): case IndexPath(row: 1, section: 0):
filterViewModel.queryServerType().subscribe(onNext: {[weak self] (result) in filterViewModel.queryServerType().subscribe(onNext: {[weak self] (result) in
if result.isEmpty {
ShowMessage("无数据")
return
}
YXPickerManager.share().showGeneralPickerView(kMainColor, dataArray: result, defaultString: controller.serviceTypeLabel.text, commit: { (text, index) in YXPickerManager.share().showGeneralPickerView(kMainColor, dataArray: result, defaultString: controller.serviceTypeLabel.text, commit: { (text, index) in
controller.serviceTypeLabel.text = text controller.serviceTypeLabel.text = text
controller.serviceTypeLabel.textColor = kBlackColor controller.serviceTypeLabel.textColor = kBlackColor
...@@ -115,6 +127,10 @@ extension RepairOrderAddViewModel { ...@@ -115,6 +127,10 @@ extension RepairOrderAddViewModel {
break break
case IndexPath(row: 2, section: 0): case IndexPath(row: 2, section: 0):
filterViewModel.queryProrityOption().subscribe(onNext: {[weak self] (result) in filterViewModel.queryProrityOption().subscribe(onNext: {[weak self] (result) in
if result.isEmpty {
ShowMessage("无数据")
return
}
YXPickerManager.share().showGeneralPickerView(kMainColor, dataArray: result, defaultString: controller.priorityLabel.text, commit: { (text, index) in YXPickerManager.share().showGeneralPickerView(kMainColor, dataArray: result, defaultString: controller.priorityLabel.text, commit: { (text, index) in
controller.priorityLabel.text = text controller.priorityLabel.text = text
controller.priorityLabel.textColor = kBlackColor controller.priorityLabel.textColor = kBlackColor
...@@ -124,6 +140,10 @@ extension RepairOrderAddViewModel { ...@@ -124,6 +140,10 @@ extension RepairOrderAddViewModel {
break break
case IndexPath(row: 3, section: 0): case IndexPath(row: 3, section: 0):
filterViewModel.queryInitiator().subscribe(onNext: {[weak self] (result) in filterViewModel.queryInitiator().subscribe(onNext: {[weak self] (result) in
if result.isEmpty {
ShowMessage("无数据")
return
}
let publicFilterVc = FilterViewController.instantiateViewController(.Function) as! FilterViewController let publicFilterVc = FilterViewController.instantiateViewController(.Function) as! FilterViewController
for model in result { for model in result {
let filterModel = PublicFilterModel(uuid: model.uuid, title: model.name, isSelected: "\(kZERO)") let filterModel = PublicFilterModel(uuid: model.uuid, title: model.name, isSelected: "\(kZERO)")
...@@ -158,6 +178,10 @@ extension RepairOrderAddViewModel { ...@@ -158,6 +178,10 @@ extension RepairOrderAddViewModel {
break break
case IndexPath(row: 7, section: 0): case IndexPath(row: 7, section: 0):
filterViewModel.queryLocation().subscribe(onNext: {[weak self] (result) in filterViewModel.queryLocation().subscribe(onNext: {[weak self] (result) in
if result.isEmpty {
ShowMessage("无数据")
return
}
let publicFilterVc = FilterViewController.instantiateViewController(.Function) as! FilterViewController let publicFilterVc = FilterViewController.instantiateViewController(.Function) as! FilterViewController
for model in result { for model in result {
let filterModel = PublicFilterModel(uuid: model.uuid, title: model.name, isSelected: "\(kZERO)") let filterModel = PublicFilterModel(uuid: model.uuid, title: model.name, isSelected: "\(kZERO)")
...@@ -176,6 +200,10 @@ extension RepairOrderAddViewModel { ...@@ -176,6 +200,10 @@ extension RepairOrderAddViewModel {
break break
case IndexPath(row: 0, section: 1): case IndexPath(row: 0, section: 1):
filterViewModel.queryDevice().subscribe(onNext: {[weak self] (result) in filterViewModel.queryDevice().subscribe(onNext: {[weak self] (result) in
if result.isEmpty {
ShowMessage("无数据")
return
}
let publicFilterVc = FilterViewController.instantiateViewController(.Function) as! FilterViewController let publicFilterVc = FilterViewController.instantiateViewController(.Function) as! FilterViewController
for model in result { for model in result {
let filterModel = PublicFilterModel(uuid: model.uuid, title: model.name, isSelected: "\(kZERO)") let filterModel = PublicFilterModel(uuid: model.uuid, title: model.name, isSelected: "\(kZERO)")
......
...@@ -32,9 +32,9 @@ class RepairOrderDetailViewModel: BaseViewModel { ...@@ -32,9 +32,9 @@ class RepairOrderDetailViewModel: BaseViewModel {
extension RepairOrderDetailViewModel { extension RepairOrderDetailViewModel {
/// 查询工单详情 /// 查询工单详情
func queryRepairOrderDetailAction(_ billNumber: String) ->Observable<Void>{ func queryRepairOrderDetailAction(_ billUuid: String) ->Observable<Void>{
return Observable.create({ (observer) -> Disposable in return Observable.create({ (observer) -> Disposable in
Network.request(target: .GetRepairOrderDetail(billNumber), success: {[weak self] (json) in Network.request(target: .GetRepairOrderDetail(billUuid), success: {[weak self] (json) in
let resultModel = RepairOrderDetailResult(fromJson: json) let resultModel = RepairOrderDetailResult(fromJson: json)
if resultModel.success { if resultModel.success {
if let model = resultModel.data { if let model = resultModel.data {
...@@ -148,7 +148,9 @@ extension RepairOrderDetailViewModel { ...@@ -148,7 +148,9 @@ extension RepairOrderDetailViewModel {
controller.sourceLab.text = billDetailModel.source controller.sourceLab.text = billDetailModel.source
controller.serverTypeLab.text = billDetailModel.serviceType controller.serverTypeLab.text = billDetailModel.serviceType
controller.priorityLab.text = billDetailModel.level controller.priorityLab.text = billDetailModel.level
if billDetailModel.reportUser != nil {
controller.userLab.text = billDetailModel.reportUser.name controller.userLab.text = billDetailModel.reportUser.name
}
controller.phoneLab.text = billDetailModel.reporterPhone controller.phoneLab.text = billDetailModel.reporterPhone
controller.createTimeLab.text = billDetailModel.createTime controller.createTimeLab.text = billDetailModel.createTime
controller.requestTimeLab.text = billDetailModel.requestTime controller.requestTimeLab.text = billDetailModel.requestTime
...@@ -157,6 +159,10 @@ extension RepairOrderDetailViewModel { ...@@ -157,6 +159,10 @@ extension RepairOrderDetailViewModel {
controller.deviceLab.text = billDetailModel.device.name controller.deviceLab.text = billDetailModel.device.name
controller.brokenTimeLab.text = billDetailModel.brokenTime controller.brokenTimeLab.text = billDetailModel.brokenTime
} }
if billDetailModel.position != nil {
controller.deviceLocationLab.text = billDetailModel.position.name
}
controller.descriptionLab.text = billDetailModel.descriptionField
controller.billNumberLab.text = billDetailModel.workNo controller.billNumberLab.text = billDetailModel.workNo
} }
......
...@@ -12,6 +12,9 @@ import Moya ...@@ -12,6 +12,9 @@ import Moya
class RepairOrderViewModel: BaseViewModel { class RepairOrderViewModel: BaseViewModel {
/// RxSwift自动释放
let disposeBag = DisposeBag()
/// 查询工单列表对象 /// 查询工单列表对象
lazy final var queryModel: RepairOrderQueryModel = { lazy final var queryModel: RepairOrderQueryModel = {
var queryModel = RepairOrderQueryModel() var queryModel = RepairOrderQueryModel()
...@@ -27,6 +30,12 @@ class RepairOrderViewModel: BaseViewModel { ...@@ -27,6 +30,12 @@ class RepairOrderViewModel: BaseViewModel {
var repairOrderArray = Array<RepairOrderRecord>() var repairOrderArray = Array<RepairOrderRecord>()
return repairOrderArray return repairOrderArray
}() }()
/// 过滤ViewModel
lazy final var filterViewModel: FilterViewModel = {
var filterViewModel = FilterViewModel()
return filterViewModel
}()
} }
extension RepairOrderViewModel { extension RepairOrderViewModel {
...@@ -69,30 +78,36 @@ extension RepairOrderViewModel { ...@@ -69,30 +78,36 @@ extension RepairOrderViewModel {
// MARK: - 工单列表筛选数据 // MARK: - 工单列表筛选数据
// 时间、状态、来源、优先级 // 时间、状态、来源、优先级
func repairOrderFilterBtnAction(_ sender: UIButton) ->Observable<Void> { func repairOrderFilterBtnAction(_ sender: UIButton) ->Observable<Void> {
return Observable.create({ (observer) -> Disposable in return Observable.create({[weak self] (observer) -> Disposable in
switch sender.tag { switch sender.tag {
case REPAIR_ORDER_FILTER_BUTTON_TAG.TIME.rawValue: case REPAIR_ORDER_FILTER_BUTTON_TAG.TIME.rawValue:
YXPickerManager.share().showGeneralPickerView(kNavColor, dataArray: ["最近一周","最近两周","最近一个月"], defaultString: sender.currentTitle, commit: { (text, index) in YXPickerManager.share().showGeneralPickerView(kNavColor, dataArray: ["最近一周","最近一个月","最近三个月","最近半年","最近一年"], defaultString: sender.currentTitle, commit: { (text, index) in
sender.isSelected = false sender.isSelected = false
sender.addBorder(1.0, kGaryColor) sender.addBorder(1.0, kGaryColor)
sender.setTitle(text, for: .normal) sender.setTitle(text, for: .normal)
sender.horizontalCenterTitleAndImageRight(5) sender.horizontalCenterTitleAndImage(5)
var afterDay: Int = -7 var afterDay: Int = -7
switch index { switch index {
case 0: case 0:
afterDay = -7 afterDay = -7
break break
case 1: case 1:
afterDay = -14 afterDay = -30
break break
case 2: case 2:
afterDay = -30 afterDay = -90
break
case 3:
afterDay = -6 * 30
break
case 2:
afterDay = -12 * 30
break break
default: default:
break break
} }
self.queryModel.startCreateTime = NSDate(after: Date(), day: afterDay).httpParameterString() self?.queryModel.startCreateTime = NSDate(after: Date(), day: afterDay).httpParameterString()
self.queryModel.endCreateTime = NSDate().httpParameterString() self?.queryModel.endCreateTime = NSDate().httpParameterString()
observer.onNext(()) observer.onNext(())
}, cancel: { }, cancel: {
sender.isSelected = false sender.isSelected = false
...@@ -104,8 +119,12 @@ extension RepairOrderViewModel { ...@@ -104,8 +119,12 @@ extension RepairOrderViewModel {
sender.isSelected = false sender.isSelected = false
sender.addBorder(1.0, kGaryColor) sender.addBorder(1.0, kGaryColor)
sender.setTitle(text, for: .normal) sender.setTitle(text, for: .normal)
sender.horizontalCenterTitleAndImageRight(5) sender.horizontalCenterTitleAndImage(5)
self.queryModel.state = repairOrderEnglishState(text!) if index == kZERO {
self?.queryModel.state = nil
}else {
self?.queryModel.state = repairOrderEnglishState(text!)
}
observer.onNext(()) observer.onNext(())
}, cancel: { }, cancel: {
sender.isSelected = false sender.isSelected = false
...@@ -113,30 +132,33 @@ extension RepairOrderViewModel { ...@@ -113,30 +132,33 @@ extension RepairOrderViewModel {
}) })
break break
case REPAIR_ORDER_FILTER_BUTTON_TAG.SOURCE.rawValue: case REPAIR_ORDER_FILTER_BUTTON_TAG.SOURCE.rawValue:
YXPickerManager.share().showGeneralPickerView(kNavColor, dataArray: ["全部来源","内部","外部"], defaultString: sender.currentTitle, commit: { (text, index) in self?.filterViewModel.queryProjectSponsors().subscribe(onNext: { (result) in
YXPickerManager.share().showGeneralPickerView(kNavColor, dataArray: result, defaultString: sender.currentTitle, commit: { (text, index) in
sender.isSelected = false sender.isSelected = false
sender.addBorder(1.0, kGaryColor) sender.addBorder(1.0, kGaryColor)
sender.setTitle(text, for: .normal) sender.setTitle(text, for: .normal)
sender.horizontalCenterTitleAndImageRight(5) sender.horizontalCenterTitleAndImage(5)
sender.updateConstraints()
observer.onNext(()) observer.onNext(())
}, cancel: { }, cancel: {
sender.isSelected = false sender.isSelected = false
sender.addBorder(1.0, kGaryColor) sender.addBorder(1.0, kGaryColor)
}) })
}).disposed(by: self!.disposeBag)
break break
case REPAIR_ORDER_FILTER_BUTTON_TAG.PRIORITY.rawValue: case REPAIR_ORDER_FILTER_BUTTON_TAG.PRIORITY.rawValue:
YXPickerManager.share().showGeneralPickerView(kNavColor, dataArray: ["全部优先级","高","中","低"], defaultString: sender.currentTitle, commit: { (text, index) in self?.filterViewModel.queryProrityOption().subscribe(onNext: {[weak self] (result) in
YXPickerManager.share().showGeneralPickerView(kNavColor, dataArray: result, defaultString: sender.currentTitle, commit: { (text, index) in
sender.isSelected = false sender.isSelected = false
sender.addBorder(1.0, kGaryColor) sender.addBorder(1.0, kGaryColor)
sender.setTitle(text, for: .normal) sender.setTitle(text, for: .normal)
sender.horizontalCenterTitleAndImageRight(5) sender.horizontalCenterTitleAndImage(5)
self.queryModel.level = text self?.queryModel.level = text
observer.onNext(()) observer.onNext(())
}, cancel: { }, cancel: {
sender.isSelected = false sender.isSelected = false
sender.addBorder(1.0, kGaryColor) sender.addBorder(1.0, kGaryColor)
}) })
}).disposed(by: self!.disposeBag)
break break
default: default:
break break
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
import UIKit import UIKit
import RxCocoa import RxCocoa
import RxSwift import RxSwift
import SwiftyJSON
class TodoViewController: BaseTableViewPullController { class TodoViewController: BaseTableViewPullController {
...@@ -57,6 +58,20 @@ class TodoViewController: BaseTableViewPullController { ...@@ -57,6 +58,20 @@ class TodoViewController: BaseTableViewPullController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return todoViewModel.todoResultArray.count return todoViewModel.todoResultArray.count
} }
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let model = todoViewModel.todoResultArray[indexPath.row]
switch model.state {
case SUBMIT_REPAIR_ORDER_STATE.DREW.rawValue:
let childBillVc = RepairOrderEditSonOrderViewController.instantiateViewController(.Function) as! RepairOrderEditSonOrderViewController
childBillVc.billModel = BillDetailExecute(fromJson: JSON(model.toDictionary()))
pushVC(childBillVc)
break
default:
break
}
}
} }
......
...@@ -34,10 +34,14 @@ class TodoViewModel: BaseViewModel { ...@@ -34,10 +34,14 @@ class TodoViewModel: BaseViewModel {
/// - state: 状态 /// - state: 状态
func queryTodoAction(_ state: TODO_STATE) ->Observable<Void> { func queryTodoAction(_ state: TODO_STATE) ->Observable<Void> {
queryModel.stateEquals = state.rawValue queryModel.stateEquals = state.rawValue
if state == .ALL {
queryModel.stateEquals = nil
}
return Observable.create({ (observer) -> Disposable in return Observable.create({ (observer) -> Disposable in
Network.request(target: .QueryTodo(self.queryModel), success: {[weak self] (json) in Network.request(target: .QueryTodo(self.queryModel), success: {[weak self] (json) in
let resultModel = TodoResultModel(fromJson: json) let resultModel = TodoResultModel(fromJson: json)
if resultModel.success { if resultModel.success {
self?.todoResultArray.removeAll()
for data in resultModel.data { for data in resultModel.data {
self?.todoResultArray.append(data) self?.todoResultArray.append(data)
} }
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
import UIKit import UIKit
import RxSwift import RxSwift
import RxCocoa import RxCocoa
import SwiftyJSON
class HomeTableViewController: BaseTableViewPullController { class HomeTableViewController: BaseTableViewPullController {
...@@ -60,6 +61,16 @@ class HomeTableViewController: BaseTableViewPullController { ...@@ -60,6 +61,16 @@ class HomeTableViewController: BaseTableViewPullController {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true) tableView.deselectRow(at: indexPath, animated: true)
let model = todoViewModel.todoResultArray[indexPath.row]
switch model.state {
case SUBMIT_REPAIR_ORDER_STATE.DREW.rawValue:
let childBillVc = RepairOrderEditSonOrderViewController.instantiateViewController(.Function) as! RepairOrderEditSonOrderViewController
childBillVc.billModel = BillDetailExecute(fromJson: JSON(model.toDictionary()))
pushVC(childBillVc)
break
default:
break
}
} }
} }
......
...@@ -8,9 +8,14 @@ ...@@ -8,9 +8,14 @@
import UIKit import UIKit
import SnapKit import SnapKit
import RxSwift
class HomeViewController: BaseViewController { class HomeViewController: BaseViewController {
/// RxSwift自动释放
let disposeBag = DisposeBag()
/// 子视图背景View /// 子视图背景View
@IBOutlet weak var contentBgView: UIView! @IBOutlet weak var contentBgView: UIView!
...@@ -19,6 +24,7 @@ class HomeViewController: BaseViewController { ...@@ -19,6 +24,7 @@ class HomeViewController: BaseViewController {
uiConfigAction() uiConfigAction()
addChildContentVc() addChildContentVc()
updateVersion()
} }
// MARK: - UI // MARK: - UI
...@@ -36,4 +42,38 @@ class HomeViewController: BaseViewController { ...@@ -36,4 +42,38 @@ class HomeViewController: BaseViewController {
make.edges.equalTo(contentBgView) make.edges.equalTo(contentBgView)
} }
} }
// MARK: - 检查版本更新
fileprivate func updateVersion() {
let viewModel = BaseViewModel()
viewModel.updateVersion().subscribe(onNext: { (result) in
if result.0 {
ShowAlertView(hint, String(format: "检测到有新版本<%@>需要更新", result.2), ["我知道了"], UIAlertControllerStyle.alert, { (index) in
UIApplication.shared.openURL(URL(string: result.1)!)
})
}
}).disposed(by: disposeBag)
}
} }
//
// UpdateVersionModel.swift
// IFS
//
// Created by 曹云霄 on 2018/1/16.
// Copyright © 2018年 上海勾芒信息科技有限公司. All rights reserved.
//
import UIKit
class UpdateVersionModel: BaseModel {
var message: String!
var data: UpdateVersionData!
var success: Bool!
}
class UpdateVersionData: BaseModel {
var forceUpdate: Int!
var type: String!
var version: String!
var backgroundUrl: String!
var url: String!
var uuid: String!
}
...@@ -169,6 +169,7 @@ ...@@ -169,6 +169,7 @@
</tableView> </tableView>
<connections> <connections>
<outlet property="accountBgView" destination="wJV-4F-PDK" id="sYL-0s-kqx"/> <outlet property="accountBgView" destination="wJV-4F-PDK" id="sYL-0s-kqx"/>
<outlet property="checkVersionLabel" destination="wVG-rh-gIw" id="7d7-k0-d5G"/>
<outlet property="userHeaderImg" destination="fid-gJ-sRJ" id="3uS-55-Dhk"/> <outlet property="userHeaderImg" destination="fid-gJ-sRJ" id="3uS-55-Dhk"/>
<outlet property="userNameLab" destination="xRI-yJ-k8g" id="zPL-Tv-Uyw"/> <outlet property="userNameLab" destination="xRI-yJ-k8g" id="zPL-Tv-Uyw"/>
</connections> </connections>
......
...@@ -22,6 +22,7 @@ class LoginViewModel: BaseViewModel { ...@@ -22,6 +22,7 @@ class LoginViewModel: BaseViewModel {
Network.request(target: .Login(login, password.md5()), success: {(json) in Network.request(target: .Login(login, password.md5()), success: {(json) in
let model = LoginResultModel(fromJson: json) let model = LoginResultModel(fromJson: json)
if model.success { if model.success {
model.data.password = password
AppManager.shareInstance.userModel = model.data AppManager.shareInstance.userModel = model.data
LoginViewModel.archiveAccountInformation() LoginViewModel.archiveAccountInformation()
observer.onNext(json.description) observer.onNext(json.description)
......
...@@ -25,6 +25,7 @@ public class UserModel : NSObject, NSCoding{ ...@@ -25,6 +25,7 @@ public class UserModel : NSObject, NSCoding{
var userCode : String! var userCode : String!
var userName : String! var userName : String!
var userUuid : String! var userUuid : String!
var password: String!
/** /**
...@@ -102,6 +103,7 @@ public class UserModel : NSObject, NSCoding{ ...@@ -102,6 +103,7 @@ public class UserModel : NSObject, NSCoding{
if userUuid != nil{ if userUuid != nil{
dictionary["user_uuid"] = userUuid dictionary["user_uuid"] = userUuid
} }
return dictionary return dictionary
} }
...@@ -125,7 +127,7 @@ public class UserModel : NSObject, NSCoding{ ...@@ -125,7 +127,7 @@ public class UserModel : NSObject, NSCoding{
userCode = aDecoder.decodeObject(forKey: "user_code") as? String userCode = aDecoder.decodeObject(forKey: "user_code") as? String
userName = aDecoder.decodeObject(forKey: "user_name") as? String userName = aDecoder.decodeObject(forKey: "user_name") as? String
userUuid = aDecoder.decodeObject(forKey: "user_uuid") as? String userUuid = aDecoder.decodeObject(forKey: "user_uuid") as? String
password = aDecoder.decodeObject(forKey: "password") as? String
} }
/** /**
...@@ -176,6 +178,9 @@ public class UserModel : NSObject, NSCoding{ ...@@ -176,6 +178,9 @@ public class UserModel : NSObject, NSCoding{
if userUuid != nil{ if userUuid != nil{
aCoder.encode(userUuid, forKey: "user_uuid") aCoder.encode(userUuid, forKey: "user_uuid")
} }
if password != nil{
aCoder.encode(password, forKey: "password")
}
} }
} }
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "loding@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "loding@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
...@@ -10,4 +10,5 @@ ...@@ -10,4 +10,5 @@
@import YXKit; @import YXKit;
#import "IQTextView.h" #import "IQTextView.h"
#import "UIDevice+Helper.h" #import "UIDevice+Helper.h"
#import "NSString+Helper.h"
#import <CommonCrypto/CommonCrypto.h> #import <CommonCrypto/CommonCrypto.h>
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>zh_CN</string> <string>zh_CN</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>工单系统</string> <string>IFS</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string> <string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
...@@ -17,9 +17,9 @@ ...@@ -17,9 +17,9 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.0</string> <string>1.0.0</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1</string> <string>1.0.0</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>NSAppTransportSecurity</key> <key>NSAppTransportSecurity</key>
......
...@@ -28,26 +28,30 @@ func ShowMessage(_ message: String) { ...@@ -28,26 +28,30 @@ func ShowMessage(_ message: String) {
} }
// MARK: - 菊花加载框,默认颜色和主题色相同 // MARK: - 菊花加载框,默认颜色和主题色相同
func ShowLoadingView(_ view: UIView?) { func ShowLoadingView(_ view: UIView) {
var hud: MBProgressHUD? if JudgeLoadingViewIsHide(view) {
if let view = view { return
hud = BaseMBProgressView(view)
}else {
hud = BaseMBProgressView(kWindow)
} }
hud!.mode = MBProgressHUDMode.indeterminate let hud = BaseMBProgressView(view)
hud!.bezelView.style = .solidColor hud.mode = MBProgressHUDMode.indeterminate
hud!.bezelView.backgroundColor = UIColor.clear hud.bezelView.style = .solidColor
hud!.contentColor = kNavColor hud.bezelView.backgroundColor = UIColor.clear
hud.contentColor = kNavColor
}
// MARK: - 判断view中是否存在MBProgressHUD
func JudgeLoadingViewIsHide(_ view: UIView) ->Bool {
for object in view.subviews {
if object.isKind(of: MBProgressHUD.classForCoder()) {
return true
}
}
return false
} }
// MARK: - 销毁对应View上所有MBProgressHUD // MARK: - 销毁对应View上所有MBProgressHUD
func HideLoadingView(_ view: UIView?) { func HideLoadingView(_ view: UIView) {
if let view = view {
MBProgressHUD.hide(for: view, animated: true) MBProgressHUD.hide(for: view, animated: true)
}else {
MBProgressHUD.hide(for: kWindow, animated: true)
}
} }
......
...@@ -21,4 +21,6 @@ target ‘IFS’ do ...@@ -21,4 +21,6 @@ target ‘IFS’ do
pod 'SKPhotoBrowser', '~> 5.0.0' pod 'SKPhotoBrowser', '~> 5.0.0'
pod 'YXPickerView' pod 'YXPickerView'
pod 'YXAlertController' pod 'YXAlertController'
pod 'ObservableArray-RxSwift', '~> 0.2.0'
pod 'PPBadgeViewSwift'
end end
...@@ -15,6 +15,9 @@ PODS: ...@@ -15,6 +15,9 @@ PODS:
- Moya/Core (10.0.1): - Moya/Core (10.0.1):
- Alamofire (~> 4.1) - Alamofire (~> 4.1)
- Result (~> 3.0) - Result (~> 3.0)
- ObservableArray-RxSwift (0.2.0):
- RxSwift (~> 4.0)
- PPBadgeViewSwift (2.0.0)
- Result (3.2.4) - Result (3.2.4)
- RxCocoa (4.1.1): - RxCocoa (4.1.1):
- RxSwift (~> 4.0) - RxSwift (~> 4.0)
...@@ -38,6 +41,8 @@ DEPENDENCIES: ...@@ -38,6 +41,8 @@ DEPENDENCIES:
- MBProgressHUD - MBProgressHUD
- MJRefresh (~> 3.1.15.1) - MJRefresh (~> 3.1.15.1)
- Moya - Moya
- ObservableArray-RxSwift (~> 0.2.0)
- PPBadgeViewSwift
- RxCocoa - RxCocoa
- RxSwift - RxSwift
- SKPhotoBrowser (~> 5.0.0) - SKPhotoBrowser (~> 5.0.0)
...@@ -60,6 +65,8 @@ SPEC CHECKSUMS: ...@@ -60,6 +65,8 @@ SPEC CHECKSUMS:
MBProgressHUD: e7baa36a220447d8aeb12769bf0585582f3866d9 MBProgressHUD: e7baa36a220447d8aeb12769bf0585582f3866d9
MJRefresh: 5f8552bc25ca8751c010f621c1098dbdaacbccd6 MJRefresh: 5f8552bc25ca8751c010f621c1098dbdaacbccd6
Moya: 9e621707ff754eeb51ff3ec51a3d54e517c0733a Moya: 9e621707ff754eeb51ff3ec51a3d54e517c0733a
ObservableArray-RxSwift: 905a088f51b1653f7eb55e6887f8a13916618f50
PPBadgeViewSwift: dc520c183e11d87fbe19bdb223e8b47d158f3c6b
Result: d2d07204ce72856f1fd9130bbe42c35a7b0fea10 Result: d2d07204ce72856f1fd9130bbe42c35a7b0fea10
RxCocoa: fd0862fd2df95fa55562ad28ffd2522c25eb4a85 RxCocoa: fd0862fd2df95fa55562ad28ffd2522c25eb4a85
RxSwift: c6e3b1c7b325c7d121cd4327e9d98b7ed746b570 RxSwift: c6e3b1c7b325c7d121cd4327e9d98b7ed746b570
...@@ -70,6 +77,6 @@ SPEC CHECKSUMS: ...@@ -70,6 +77,6 @@ SPEC CHECKSUMS:
YXKit: 73d6ffbcf7530f1159e030460207286e9153b080 YXKit: 73d6ffbcf7530f1159e030460207286e9153b080
YXPickerView: 527ca74d8fbe73b4e9bd0bbff6e143133dced907 YXPickerView: 527ca74d8fbe73b4e9bd0bbff6e143133dced907
PODFILE CHECKSUM: bbdde573a885a7ec99a2e993aa40f5a213c0d05d PODFILE CHECKSUM: 04404f79c4f31a2c2f3feddc2c782615ce22ffce
COCOAPODS: 1.3.0 COCOAPODS: 1.3.0
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