// // NewTransportViewController.m // XFFruit // // Created by 陈俊俊 on 15/9/6. // Copyright (c) 2015年 Xummer. All rights reserved. // #import "NewTransportViewController.h" #import "TopTransportView.h" #import "BottomTransportView.h" #import "TransportPurchaseViewController.h" #import "NewCostViewController.h" #import "TransportPdtDetail.h" #import "FeeAcountDetail.h" #import "TransportViewController.h" #import "ShopDetaileViewController.h" #import "PurchaseBill.h" #import "ProductStockModel.h" NSInteger purchaseAddStockCheckNumber = 0; typedef enum : NSUInteger { SaveTag = 7000, CommitTag, } BtnTag; #define TopHeight 328 #define BottomHeight 290 #define SpaceHeight 20 #define BottomViewHeight 60 @interface NewTransportViewController () { UIScrollView *_scrollView; TopTransportView *_sheetView; BottomTransportView *_bottomView; id uuidObject; id billNumberObject; NSNumber *versionObject; id stateObject; } @property (nonatomic,strong)NSString *state; /** * 用户选择的第一个商品的采购单 */ @property (strong, nonatomic) PurchaseBill *firstBill; /** * 缓存的选择的采购单数据 */ @property (strong, nonatomic) NSMutableDictionary *dicProduct; @end @implementation NewTransportViewController - (void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (instancetype)init{ self = [super init]; if (self) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(choseTransportPurchase) name:KNOTIFICATION_ChoseTransportPurchase object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addTransportCost:) name:KNOTIFICATION_AddTransportCost object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addPurchaseProduct:) name:KNOTIFICATION_AddPurchaseProduct object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deleteInPurchase:) name:KNOTIFICATION_DeleteTransportPdtInPurchase object:nil]; } return self; } - (void)viewDidLoad { [super viewDidLoad]; //布局 [self bulidLayout]; uuidObject = [NSNull null]; billNumberObject = [NSNull null]; versionObject = [NSNumber numberWithInteger:0]; stateObject = [NSNull null]; if (self.transport) { [self getDataFromServer]; } } - (void)getDataFromServer{ __weak typeof(self)weakSelf = self; void(^succ)(id) = ^(id data) { [IBTLoadingView hideHUDWithText:nil]; __strong __typeof(weakSelf)strongSelf = weakSelf; if (data) { NSInteger success = [data[@"success"] integerValue]; NSString *message = data[@"message"] ; if (success == 1) { NSDictionary *dictData = data[@"data"]; Transport *transport = [[Transport alloc]init]; [transport setValuesForKeysWithDictionary:dictData]; self.transport = transport; [strongSelf fetchtTransportDetail]; }else{ [IBTLoadingView showTips:message]; } }else{ [IBTLoadingView showTips:@" 无记录 "]; } }; void(^fail)(id) = ^(id data) { [IBTLoadingView hideHUDWithText:nil]; [IBTLoadingView showTips:data]; }; [IBTLoadingView showProgressLabel:@"正在加载..."]; [[ICRHTTPController sharedController] getTransportResultWithTransportUuid:self.transport.uuid success:succ failure:fail]; } - (void)fetchtTransportDetail { _sheetView.transport = self.transport; [_bottomView refreshCost:self.transport.accountDetails]; [_bottomView refreshTranProduct:self.transport.pdtDetails]; //清空缓存,重新 [self.dicProduct removeAllObjects]; for (TransportPdtDetail *pdtDetail in _bottomView.productVC.transportProductArr) { NSMutableArray *arrProduct = [self.dicProduct objectForKey:pdtDetail.purchasebillnumber]; if (!arrProduct) { arrProduct = [NSMutableArray array]; [self.dicProduct setObject:arrProduct forKey:pdtDetail.purchasebillnumber]; } [arrProduct addObject:pdtDetail]; } } - (void)deleteInPurchase:(NSNotification *)noti { NSString *bill = noti.object; [self deletePdtUnderPurchaseBillNumber:bill]; } - (void)deletePdtUnderPurchaseBillNumber:(NSString *)billNumber { NSMutableArray *arrInBill = [NSMutableArray array]; for (TransportPdtDetail *pdt in _bottomView.productVC.transportProductArr) { if ([pdt.purchasebillnumber isEqualToString:billNumber]) { [arrInBill addObject:pdt]; } } NSMutableArray *orign = _bottomView.productVC.transportProductArr.mutableCopy; [orign removeObjectsInArray:arrInBill]; // if (self.transport) { // self.transport.pdtDetails = orign; // [self fetchtTransportDetail]; // // }else{ _bottomView.productVC.transportProductArr = orign; [_bottomView.productVC refresh]; //清空缓存,重新 [self.dicProduct removeAllObjects]; for (TransportPdtDetail *pdtDetail in _bottomView.productVC.transportProductArr) { NSMutableArray *arrProduct = [self.dicProduct objectForKey:pdtDetail.purchasebillnumber]; if (!arrProduct) { arrProduct = [NSMutableArray array]; [self.dicProduct setObject:arrProduct forKey:pdtDetail.purchasebillnumber]; } [arrProduct addObject:pdtDetail]; } // } } - (void)bulidLayout{ self.view.backgroundColor = XXFBgColor; _scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0,0, ScreenSize.width, ScreenSize.height- 64 - BottomViewHeight )]; _scrollView.showsHorizontalScrollIndicator = NO; _scrollView.showsVerticalScrollIndicator = NO; _scrollView.contentSize = CGSizeMake(ScreenSize.width, TopHeight+ BottomHeight + SpaceHeight*2); [self.view addSubview:_scrollView]; UIView *footView = [[UIView alloc]initWithFrame:CGRectMake(0, ScreenSize.height - BottomViewHeight - 64, ScreenSize.width, BottomViewHeight)]; UIButton *saveBtn = [IBTCustomButtom creatButtonWithFrame:CGRectMake(15, 8, (ScreenSize.width - 15*3)/2, 44) target:self sel:@selector(btnClick:) tag:SaveTag image:nil title:@"保存" titleColor: [UIColor whiteColor] isCorner:YES corner:5 bgColor:GXF_SAVE_COLOR]; [footView addSubview:saveBtn]; UIButton *commitBtn = [IBTCustomButtom creatButtonWithFrame:CGRectMake(CGRectGetMaxX(saveBtn.frame) + 15, 8, (ScreenSize.width - 15*3)/2, 44) target:self sel:@selector(btnClick:) tag:CommitTag image:nil title:@"提交" titleColor: [UIColor whiteColor] isCorner:YES corner:5 bgColor:GXF_COMMIT_COLOR]; [footView addSubview:commitBtn]; [self.view addSubview:footView]; _sheetView = [[TopTransportView alloc]initWithFrame:CGRectMake(0, 0, ScreenSize.width, TopHeight)]; _sheetView.delegate = self; [_scrollView addSubview:_sheetView]; _bottomView = [[BottomTransportView alloc]initWithFrame:CGRectMake(0, CGRectGetMaxY(_sheetView.frame) + 20, ScreenSize.width,BottomHeight) withHidden:NO]; _bottomView.backgroundColor = [UIColor whiteColor]; [_scrollView addSubview:_bottomView]; } - (void)btnClick:(UIButton *)btn{ switch (btn.tag) { case SaveTag: { if ([self checkTransport]) { self.state = TRANSFER_STATE_INITIAL; [self getDataFromServer:TRANSPORT_STATE_INITIAL msg:@"正在保存..."]; } } break; case CommitTag:{ if ([self checkTransport]) { NSArray *array = self.dicProduct.allKeys; WS(weakSelf); //判断数量问题 [IBTLoadingView showProgressLabel:@""]; [self stockValidWithDic:self.dicProduct billNumbers:array complete:^{ [IBTLoadingView hideHUDWithText:@""]; UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"请确认提交" delegate:weakSelf cancelButtonTitle:@"取消" otherButtonTitles:@"确认", nil]; alertView.delegate = weakSelf; [alertView show]; }]; } } break; default: break; } } /** * 查库存接口 * * @param dic 存放已选择单据 * @param billNumbers 单号 * @param complete 回调 */ - (void)stockValidWithDic:(NSMutableDictionary *)dic billNumbers:(NSArray *)billNumbers complete:(void (^)(void))complete { //如果billNumbers数量为0,说明没有去选择 NSString *billNum = billNumbers[purchaseAddStockCheckNumber]; NSMutableArray *arrProducts = [dic objectForKey:billNum]; __weak NewTransportViewController *weakSelf = self; [HTTP purchaseStockWithPurchaseUuid:billNum success:^(id succ) { if (![succ[@"data"] isKindOfClass:[NSArray class]]) { [IBTLoadingView hideHUDWithText:@""]; NSString *msg = [NSString stringWithFormat:@"该批次<%@>在总部系统的库存不足!", billNum]; ShowMessage(msg); return ; } for (NSDictionary *dict in succ[@"data"]) { ProductStockModel *model = [ProductStockModel new]; [model setValuesForKeysWithDictionary:dict]; for (TransportPdtDetail *detail in arrProducts) { if ([detail.productCode isEqualToString:model.productCode]) { if (detail.baseQty.floatValue > model.qty.floatValue) { CLog(@"库存不足"); [IBTLoadingView hideHUDWithText:@""]; purchaseAddStockCheckNumber = 0; NSString *msg = [NSString stringWithFormat:@"该批次<%@>的商品%@在总部系统的库存不足!", billNum, detail.productName]; ShowMessage(msg); return ; } } } } purchaseAddStockCheckNumber += 1; if (purchaseAddStockCheckNumber == billNumbers.count) { purchaseAddStockCheckNumber = 0; complete(); }else{ [weakSelf stockValidWithDic:dic billNumbers:billNumbers complete:complete]; } } failure:^(id fail) { [IBTLoadingView hideHUDWithText:@""]; purchaseAddStockCheckNumber = 0; }]; } - (void)getDataFromServer:(NSString *)state msg:(NSString *)msg{ //保存 void(^succ)(id) = ^(id data) { [IBTLoadingView hideHUDWithText:nil]; if (data) { NSInteger success = [data[@"success"] integerValue]; NSString *message = data[@"message"]; if (success == 1) { //成功 if ([state isEqualToString:PURCHASE_STATE_INITIAL]) {//保存成功 NSString *uuidS = data[@"data"][@"uuid"]; NSString *billNumberS = data[@"data"][@"billNumber"]; NSNumber *versionN = data[@"data"][@"version"]; uuidObject = uuidS; billNumberObject = billNumberS; versionObject = versionN; [IBTLoadingView showTips:[NSString stringWithFormat:@"当前单据%@已保存成功",billNumberS]]; }else{//提交成功 TransportViewController *svc = [TransportViewController new]; svc.title = @"发运单列表"; [self PushViewController:svc animated:YES]; } }else{ ShowMessage(message); } } }; void(^fail)(id) = ^(id data) { [IBTLoadingView hideHUDWithText:nil]; [IBTLoadingView showTips:data]; }; if(self.transport.uuid.length > 0 && uuidObject == [NSNull null]){ uuidObject = self.transport.uuid; } if (self.transport.billnumber > 0 && billNumberObject == [NSNull null]) { billNumberObject = self.transport.billnumber; } if (self.transport.state > 0 && stateObject == [NSNull null]) { stateObject = self.transport.state; }else{ stateObject = state; } if (self.transport && [versionObject integerValue] == 0) { versionObject = self.transport.version; } NSMutableArray *billProducts = [NSMutableArray array]; for (TransportPdtDetail *pdtDetail in _bottomView.productVC.transportProductArr) { TransportPdtDetail *pdtCopy = [[TransportPdtDetail alloc] init]; [pdtCopy setValuesForKeysWithDictionary:pdtDetail.dictForCommit]; pdtCopy.shippedFlag = nil; pdtCopy.shippedQty = nil; pdtCopy.receivedQty = nil; [billProducts addObject:[pdtCopy dictForCommit]]; } NSMutableArray *costs = [NSMutableArray array]; for (FeeAcountDetail *fee in _bottomView.costVC.costArr) { [costs addObject:[fee dictForCommit]]; } //获取到期时间 NSString *dateString = [[NSDate date] httpParameterString]; NSDateFormatter *f = [NSDateFormatter new]; [f setDateFormat:@"yyy-MM-dd HH:ss:mm"]; NSDate *date = [f dateFromString:dateString]; NSDate *new = [NSDate dateWithTimeInterval:60 * 60 * 24 * 5 sinceDate:date]; NSString *expiredTime = [f stringFromDate:new]; NSDictionary *dict = @{@"uuid":uuidObject, @"version":versionObject, @"billnumber":billNumberObject, @"enterprise":[ICRUserUtil sharedInstance].orgId, @"state":stateObject, @"expiredDate":expiredTime, @"warehouseUuid":[IBTCommon checkString:_sheetView.warehouseUuid], @"warehouseCode":[IBTCommon checkString:_sheetView.warehouseCode], @"warehouseName":[IBTCommon checkString:_sheetView.warehouseName], @"rwarehouseUuid":[IBTCommon checkString:_sheetView.rwarehouseUuid], @"rwarehouseCode":[IBTCommon checkString:_sheetView.rwarehouseCode], @"rwarehouseName":[IBTCommon checkString:_sheetView.rwarehouseName], @"carnumber":[IBTCommon checkString:_sheetView.carnumber], @"type":[IBTCommon checkString:_sheetView.type], @"carphone":[IBTCommon checkString:_sheetView.carphone], @"arriveDate":[IBTCommon checkString:_sheetView.arriveDate], @"note":[IBTCommon checkString:_sheetView.note], @"pdtDetails":billProducts, @"accountDetails":costs}; [IBTLoadingView showProgressLabel:msg]; if ([state isEqualToString:TRANSFER_STATE_INITIAL]) { [[ICRHTTPController sharedController] saveTransportWithData:dict success:succ failure:fail]; }else{ [[ICRHTTPController sharedController] saveAndSubmitTransportWithData:dict success:succ failure:fail]; } } - (BOOL)checkTransport{ _sheetView.note = _sheetView.remarkTextView.text; _sheetView.carnumber = _sheetView.carTextFiled.text; _sheetView.carphone = _sheetView.phoneTextFiled.text; if (_sheetView.warehouseName.length == 0 ) { ShowMessage(@"发货仓库不能为空"); return NO; } if (_sheetView.rwarehouseUuid.length == 0 ) { ShowMessage(@"收货仓库不能为空"); return NO; } if (_sheetView.type.length == 0 ) { ShowMessage(@"运输类型不能为空"); return NO; } if (_sheetView.carnumber.length == 0) { ShowMessage(@"车牌号不能为空"); return NO; } if (_sheetView.carphone.length == 0) { ShowMessage(@"司机电话不能为空"); return NO; } if (_sheetView.arriveDate.length == 0) { ShowMessage(@"预计到货时间不能为空"); return NO; } if (_bottomView.productVC.transportProductArr.count == 0) { ShowMessage(@"商品不能为空"); return NO; } if (_bottomView.costVC.costArr.count == 0) { ShowMessage(@"费用不能为空"); return NO; } for (TransportPdtDetail *billProduct in _bottomView.productVC.transportProductArr) { if ([billProduct.qty floatValue] <= 0 || [billProduct.baseQty floatValue] <= 0) { ShowMessage(@"有数量等于0的商品明细,请编辑后保存"); return NO; } // if ([billProduct.price floatValue] <=0 || [billProduct.packprice floatValue] <= 0) { // ShowMessage(@"有价格未填写的商品明细,请编辑后保存"); // return NO; // } } // 校验手机号码 if (![RegexUtil isValidatePhone:_sheetView.carphone] || ![RegexUtil isValidatePhoneNew:_sheetView.carphone]){ ShowMessage(@"手机号格式不正确"); return NO; } return YES; } - (void)setFirstBill:(PurchaseBill *)firstBill { _firstBill = firstBill; /** * @property (nonatomic,strong)NSString *receiveWrh_uuid;//收货uuid @property (nonatomic,strong)NSString *receiveWrh_code;//收货代码 @property (nonatomic,strong)NSString *receiveWrh_name;//收货姓名 * */ _sheetView.warehouseCode = firstBill.receiveWrh_code; _sheetView.warehouseName = firstBill.receiveWrh_name; _sheetView.warehouseUuid = firstBill.receiveWrh_uuid; _sheetView.warehouseLabel.text = [NSString stringWithFormat:@"%@[%@]",_sheetView.warehouseName,_sheetView.warehouseCode]; _sheetView.warehouseLabel.textColor = GXF_CONTENT_COLOR; } - (void)choseTransportPurchase{ __weak NewTransportViewController *weakSelf = self; TransportPurchaseViewController *tpv = [TransportPurchaseViewController new]; tpv.isTransportIn = YES; tpv.getProchaseProduct = ^(NSArray *products){ if (products.count > 0) { [_bottomView reProduct:products]; } }; tpv.blockFirstWarehouse = ^(NSArray *bills){ if (bills.count > 0) { weakSelf.firstBill = bills[0]; } }; tpv.dicProduct = self.dicProduct; [self PushViewController:tpv animated:YES]; } - (void)addTransportCost:(NSNotification *)fination{ NewCostViewController *nvc = [NewCostViewController new]; NSIndexPath *indexPath = [[fination userInfo] objectForKey:@"indexPath"]; FeeAcountDetail *fee = [[fination userInfo] objectForKey:@"feeAccountDetail"]; if (indexPath) { nvc.navTitle = @"编辑费用"; nvc.indexPath = indexPath; nvc.accountDetail = fee; }else{ nvc.navTitle = @"添加费用"; } nvc.getTransportCost = ^(FeeAcountDetail *fee,NSIndexPath *indexPath){ if (fee) { [_bottomView refreshCost:fee indexPath:indexPath]; } }; nvc.deleteTransportCost = ^(FeeAcountDetail *fee,NSIndexPath *indexPath){ if (fee) { [_bottomView refreshDelCost:fee indexPath:indexPath]; } }; [self PushViewController:nvc animated:YES]; } - (void)addPurchaseProduct:(NSNotification *)fication{ TransportPdtDetail *billProduct = [[fication userInfo] objectForKey:@"transportPdtDetail"]; NSInteger indexTag = [[[fication userInfo] objectForKey:@"indexTag"] integerValue]; ShopDetaileViewController *svc = [[ShopDetaileViewController alloc] init]; if (billProduct) { svc.intertype = ShopDetailInterTypeTransport; svc.navTitle = @"编辑商品"; ShopDetail *shopDetail=[self coverShopDetail:billProduct]; shopDetail.IsXiuGai=YES; svc.choseShopDetail = ^(ShopDetail *Detail){ TransportPdtDetail *tdetail = [self coverTransportPdtDetail:Detail]; if (Detail.IsDeleted) { [_bottomView refreshDelProduct:tdetail tag:indexTag]; //清空缓存,重新 [self.dicProduct removeAllObjects]; for (TransportPdtDetail *pdtDetail in _bottomView.productVC.transportProductArr) { NSMutableArray *arrProduct = [self.dicProduct objectForKey:pdtDetail.purchasebillnumber]; if (!arrProduct) { arrProduct = [NSMutableArray array]; [self.dicProduct setObject:arrProduct forKey:pdtDetail.purchasebillnumber]; } [arrProduct addObject:pdtDetail]; } }else{ [_bottomView refreshEditProduct:tdetail tag:indexTag]; } }; svc.shopDetail=shopDetail; }else{ svc.navTitle = @"添加商品"; // 回调 svc.choseShopDetail = ^(ShopDetail *shopDetail){ TransportPdtDetail *tdetail = [self coverTransportPdtDetail:shopDetail]; [_bottomView refreshProduct:tdetail]; }; } [self PushViewController:svc animated:YES]; } - (TransportPdtDetail *)coverTransportPdtDetail:(ShopDetail *)shopDetail{ TransportPdtDetail *billProduct = [[TransportPdtDetail alloc]init]; billProduct.uuid = shopDetail.uuid; billProduct.productUuid = shopDetail.product_uuid; billProduct.productCode = shopDetail.product_code; billProduct.productName = shopDetail.merchandise; billProduct.qpc = [NSNumber numberWithFloat:[shopDetail.packageSpecification floatValue]]; billProduct.unit = shopDetail.packageUnit; billProduct.qty = [NSNumber numberWithFloat:[shopDetail.packageQuantity floatValue]]; billProduct.packprice = [NSNumber numberWithFloat:[shopDetail.packageUnitPrice floatValue]]; billProduct.price = [NSNumber numberWithFloat:[shopDetail.foundationUnitPrice floatValue]]; billProduct.baseQty = [NSNumber numberWithFloat:[shopDetail.foundationQuantity floatValue]]; billProduct.total = [NSNumber numberWithFloat:[shopDetail.totalMoney floatValue]]; billProduct.note = shopDetail.remark; billProduct.qpcStr = shopDetail.packageQpcStr ? shopDetail.packageQpcStr : @"无" ; billProduct.baseUnit = shopDetail.packageQpcUnit; billProduct.purchasebillnumber = shopDetail.sourceBillNumber; billProduct.purchasePdtDetail = shopDetail.sourceDetail; billProduct.receivedQty = shopDetail.receivedQty; billProduct.shippedQty = shopDetail.shippedQty; return billProduct; } - (ShopDetail *)coverShopDetail:(TransportPdtDetail *)billProduct{ ShopDetail *shopDetail = [[ShopDetail alloc]init]; [shopDetail setValuesForKeysWithDictionary:billProduct.dictForCommit]; shopDetail.uuid = billProduct.uuid; shopDetail.product_uuid = billProduct.productUuid; shopDetail.product_code = billProduct.productCode; shopDetail.merchandise = billProduct.productName; shopDetail.packageSpecification = [billProduct.qpc stringValue]; shopDetail.packageUnit = billProduct.unit; shopDetail.packageQuantity = [billProduct.qty stringValue]; shopDetail.packageUnitPrice = billProduct.packprice; shopDetail.foundationUnitPrice= billProduct.price; shopDetail.foundationQuantity= [billProduct.baseQty stringValue]; shopDetail.totalMoney= billProduct.total; shopDetail.remark = billProduct.note; shopDetail.sourceDetail = billProduct.purchasePdtDetail; shopDetail.sourceBillNumber = billProduct.purchasebillnumber; shopDetail.receivedQty = billProduct.receivedQty; shopDetail.shippedQty = billProduct.shippedQty; return shopDetail; } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ if (buttonIndex == 1) { //提交 self.state = TRANSPORT_STATE_RECEIVED; [self getDataFromServer:TRANSPORT_STATE_RECEIVED msg:@"正在提交..."]; } } #pragma mark - TopPurchaseViewDelegate - (void)pushNextViewController:(id)vc{ [self PushViewController:vc animated:YES]; } #pragma mark - 协议方法 - (void)hiddenKeyBoard{ [self keyboardHidden]; } - (void)keyboardHidden{ [_sheetView.phoneTextFiled resignFirstResponder]; [_sheetView.carTextFiled resignFirstResponder]; [_sheetView.remarkTextView resignFirstResponder]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; if(self.transport && [self.state isEqualToString:TRANSPORT_STATE_INITIAL]){ [ICRUserUtil sharedInstance].needFresh = YES; } if (_sheetView.startTimeView) { [_sheetView.startTimeView removeFromSuperview]; _sheetView.startTimeView = nil; } } - (NSMutableDictionary *)dicProduct { if (!_dicProduct) { _dicProduct = [NSMutableDictionary dictionary]; } return _dicProduct; } /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ @end