usingHh.Mes.Common.log;usingHh.Mes.Common.Request;usingHh.Mes.POJO.Entity;usingHh.Mes.POJO.EnumEntitys;usingHh.Mes.POJO.Response;usingHh.Mes.Service.Repository;usingSqlSugar;usingSystem;usingSystem.Collections.Generic;usingSystem.Data;usingSystem.Diagnostics;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;namespaceHh.Mes.Service.Material{publicclassProductionOrderService:RepositorySqlSugar<bus_pro_plan_head>{///<summary>///初始化///</summary>privateintinitState{get;set;}///<summary>///已确认///</summary>privateintconfirmState{get;set;}publicProductionOrderService(){initState=(int)EnumProPlan.初始化;confirmState=(int)EnumProPlan.已确认;}#region列表///<summary>///获取工单列表///</summary>publicResponseGetProductionOrderList(PageReqpageReq,bus_pro_plan_headentity){varresult=newResponse();stringorderBy=(pageReq==null||string.IsNullOrEmpty(pageReq.field))?" id desc":$"{pageReq.field} {pageReq.order} ";stringsqlWhere=SqlProductionOrderWhere(entity);varstringBuilder=newStringBuilder();//页码,页数//Exelture不分页if(!entity.Exel&&pageReq!=null){stringBuilder.Append("declare @pageIndex int,@pageSize int,@offset int");stringBuilder.AppendLine($" select @pageIndex={pageReq.page}, @pageSize={pageReq.limit}, @offset=(@pageIndex - 1) * @pageSize");}stringBuilder.AppendLine($@" select * from bus_pro_plan_head where {sqlWhere} order by {orderBy} ");//Exelture不分页if(!entity.Exel){stringBuilder.AppendLine(" offset @offset row fetch next @pageSize row only ");stringBuilder.Append($@" select rowTotal= count(*) from bus_pro_plan_head where {sqlWhere}");}varparameters=newList<SugarParameter>(){newSugarParameter("@planCode",entity.planCode),newSugarParameter("@planName",entity.planName),newSugarParameter("@productCode",entity.productCode),newSugarParameter("@productName",entity.productName)};vards=base.Context.Ado.GetDataSetAll(stringBuilder.ToString(),parameters);result.Result=ds.Tables[0];result.Count=entity.Exel?(int)result.Result.Rows.Count:(int)ds.Tables[1].Rows[0]["rowTotal"];returnresult;}///<summary>///获取工单列表明细///</summary>publicResponseGetProductionOrderDetailList(PageReqpageReq,bus_pro_plan_headentity){varresult=newResponse();stringorderBy=(pageReq==null||string.IsNullOrEmpty(pageReq.field))?" id asc":$"{pageReq.field} {pageReq.order} ";stringsqlWhere=SqlProductionOrderDetailWhere(entity);varstringBuilder=newStringBuilder();//页码,页数//Exelture不分页if(!entity.Exel&&pageReq!=null){stringBuilder.Append("declare @pageIndex int,@pageSize int,@offset int");stringBuilder.AppendLine($" select @pageIndex={pageReq.page}, @pageSize={pageReq.limit}, @offset=(@pageIndex - 1) * @pageSize");}stringBuilder.AppendLine($@" select * from bus_pro_plan_detail where {sqlWhere} order by {orderBy} ");//Exelture不分页if(!entity.Exel){stringBuilder.AppendLine(" offset @offset row fetch next @pageSize row only ");stringBuilder.Append($@" select rowTotal= count(*) from bus_pro_plan_detail where {sqlWhere}");}varparameters=newList<SugarParameter>(){newSugarParameter("@proPlanHeadKeys",entity.keys),};vards=base.Context.Ado.GetDataSetAll(stringBuilder.ToString(),parameters);result.Result=ds.Tables[0];result.Count=entity.Exel?(int)result.Result.Rows.Count:(int)ds.Tables[1].Rows[0]["rowTotal"];returnresult;}///<summary>///获取工单列表明细Bom///</summary>publicResponseGetProductionOrderDetailBomList(PageReqpageReq,bus_pro_plan_detailentity){varresult=newResponse();stringorderBy=(pageReq==null||string.IsNullOrEmpty(pageReq.field))?" id asc":$"{pageReq.field} {pageReq.order} ";stringsqlWhere=SqlProductionOrderDetailBomWhere();varstringBuilder=newStringBuilder();//页码,页数//Exelture不分页if(!entity.Exel&&pageReq!=null){stringBuilder.Append("declare @pageIndex int,@pageSize int,@offset int");stringBuilder.AppendLine($" select @pageIndex={pageReq.page}, @pageSize={pageReq.limit}, @offset=(@pageIndex - 1) * @pageSize");}stringBuilder.AppendLine($@" select * from bus_pro_plan_detail_bom where {sqlWhere} order by {orderBy} ");//Exelture不分页if(!entity.Exel){stringBuilder.AppendLine(" offset @offset row fetch next @pageSize row only ");stringBuilder.Append($@" select rowTotal= count(*) from bus_pro_plan_detail_bom where {sqlWhere}");}varparameters=newList<SugarParameter>(){newSugarParameter("@proPlanDetailKeys",entity.bodyKeys),};vards=base.Context.Ado.GetDataSetAll(stringBuilder.ToString(),parameters);result.Result=ds.Tables[0];result.Count=entity.Exel?(int)result.Result.Rows.Count:(int)ds.Tables[1].Rows[0]["rowTotal"];returnresult;}publicstringSqlProductionOrderWhere(bus_pro_plan_headmodel){varstringBuilder=newStringBuilder();stringBuilder.Append(" 1=1 ");if(!string.IsNullOrEmpty(model.planCode)){stringBuilder.Append(" and planCode = @planCode ");}if(!string.IsNullOrEmpty(model.planName)){stringBuilder.Append(" and planName like '%'+@planName+'%' ");}if(!string.IsNullOrEmpty(model.productCode)){stringBuilder.Append(" and productCode = @productCode ");}if(!string.IsNullOrEmpty(model.productName)){stringBuilder.Append(" and productName like '%'+@productName+'%' ");}//下拉弹出搜索框//if(!string.IsNullOrEmpty(model.codeOrName))//{//stringBuilder.Append($" and (t1.materialCode like '%'+@codeOrName+'%' or t1.materialName like '%'+@codeOrName+'%' ) ");//}returnstringBuilder.ToString();}publicstringSqlProductionOrderDetailWhere(bus_pro_plan_headmodel){varstringBuilder=newStringBuilder();stringBuilder.Append(" 1=1 ");stringBuilder.Append(" and proPlanHeadKeys = @proPlanHeadKeys ");returnstringBuilder.ToString();}publicstringSqlProductionOrderDetailBomWhere(){varstringBuilder=newStringBuilder();stringBuilder.Append(" 1=1 ");stringBuilder.Append(" and proPlanDetailKeys = @proPlanDetailKeys ");returnstringBuilder.ToString();}#endregion///<summary>///新增生产计划工单///</summary>///<paramname="entity"></param>///<returns></returns>publicdynamicIns(bus_pro_plan_headentity){returnExceptionsHelp.Instance.ExecuteT(()=>{varresponse=newResponse();varisExistCount=Context.Queryable<bus_pro_plan_head>().Where(x=>x.planCode==entity.planCode).Count();if(isExistCount>0)returnresponse.ResponseError("生产计划 已存在相同的计划号【"+entity.planCode+"】的记录!请勿重复!");if(entity.productHeadKeys==Guid.Empty)returnresponse.ResponseError("生产计划 选择的产品名称【"+entity.productName+"】没有关联工艺路线,请重新绑定!");if(entity.planEndTime<entity.planStartTime)returnresponse.ResponseError("计划结束时间不能小于计划开始时间!");entity.keys=Guid.NewGuid();entity.createBy=sysWebUser.Account;entity.createTime=DateTime.Now;entity.status=initState;varmaterialCodeList=Context.Queryable<base_product_detail>().Where(x=>x.headKeys==entity.productHeadKeys).Select(x=>x.materialCode).ToList();if(materialCodeList.Count==0)returnresponse.ResponseError("生产计划 选择的产品【"+entity.productName+"】没有产品明细信息!");varmaterialList=Context.Queryable<base_material_rate>().Where(x=>materialCodeList.Contains(x.materialCode)).ToList();if(materialList.Count==0)returnresponse.ResponseError("生产计划 选择的产品【"+entity.productName+"】明细物料信息【"+string.Join(",",materialCodeList)+"】没有绑定物料比例,请在物料信息=>编辑物料BOM比例 绑定!");Context.Insertable(entity).AddQueue();for(intindex=0;index<entity.quantity;index++){vardetail=newbus_pro_plan_detail();detail.bodyKeys=Guid.NewGuid();detail.proPlanHeadKeys=entity.keys;detail.workOrderCode=DateTime.Now.ToString("yyyyMMddHHmmss")+getNumber((index+1).ToString());detail.workOrderName=entity.planName+getNumber((index+1).ToString());detail.lineCode=entity.lineCode;detail.productCode=entity.productCode;detail.productName=entity.productName;detail.createBy=sysWebUser?.Account;detail.createTime=DateTime.Now;intcount=0;inti=1;foreach(varmaterialinmaterialList){count+=material.quantityRate.Value;varbom=newbus_pro_plan_detail_bom();bom.bodyKeys=Guid.NewGuid();bom.proPlanHeadKeys=entity.keys;bom.proPlanDetailKeys=detail.bodyKeys;bom.materialCode=material.materialCode;bom.materialName=material.materialName;bom.oprSequenceCode=material.oprSequenceCode;bom.detailSN=DateTime.Now.ToString("yyyyMMddHHmmss")+getNumber((i++).ToString());bom.spec=material.specifications;bom.unit=material.unitCode;bom.productCode=entity.productCode;bom.quantity=material.quantityRate.Value;bom.createBy=sysWebUser.Account;bom.createTime=DateTime.Now;Context.Insertable(bom).AddQueue();varrel=newbus_pro_plan_detail_bom_rel();rel.proPlanHeadKeys=entity.keys;rel.proPlanDetailBodyKeys=detail.bodyKeys;rel.proPlanDetailBomBodyKeys=bom.bodyKeys;rel.createBy=sysWebUser.Account;rel.createTime=DateTime.Now;Context.Insertable(rel).AddQueue();}detail.quantity=count;Context.Insertable(detail).AddQueue();}varresultCount=Context.SaveQueues();returnresultCount>0?response.ResponseSuccess():response.ResponseError();});}privatestringgetNumber(stringindex){while(index.Length<5){index="0"+index;}returnindex;}///<summary>///更新生产计划工单///</summary>publicdynamicUpd(bus_pro_plan_headentity){varresponse=newResponse();returnExceptionsHelp.Instance.ExecuteT(()=>{varisExistCount=Context.Queryable<bus_pro_plan_head>().Where(x=>x.planCode==entity.planCode&&x.id!=entity.id).Count();if(isExistCount>0){response.ResponseErr("已存在工单为【"+entity.planCode+"】的记录!请勿重复!");returnresponse;}if(entity.planEndTime<entity.planStartTime){response.ResponseErr("计划结束时间不能小于计划开始时间!");returnresponse;}entity.updateBy=sysWebUser.Account;entity.updateTime=DateTime.Now;entity.status=(int)EnumProPlan.初始化;response.Status=Context.Updateable(entity).Where(u=>u.id==entity.id).ExecuteCommand()>0;if(!response.Status)response.Message="更新失败";if(response.Status){varcountResult=Context.Queryable<bus_pro_plan_detail>().Where(x=>x.proPlanHeadKeys==entity.keys).Count();if(countResult!=entity.quantity){Context.Deleteable<bus_pro_plan_detail>().Where(x=>x.proPlanHeadKeys==entity.keys).AddQueue();Context.Deleteable<bus_pro_plan_detail_bom>().Where(x=>x.proPlanHeadKeys==entity.keys).AddQueue();Context.Deleteable<bus_pro_plan_detail_bom_rel>().Where(x=>x.proPlanHeadKeys==entity.keys).AddQueue();varproductCodeList=Context.Queryable<base_product_header>().Where(x=>x.productCode==entity.productCode).Select(x=>x.keys).ToList();varmaterialCodeList=Context.Queryable<base_product_detail>().Where(x=>productCodeList.Contains(x.headKeys)).Select(x=>x.materialCode).ToList();varmaterialList=Context.Queryable<base_material_rate>().Where(x=>materialCodeList.Contains(x.materialCode)).ToList();if(materialList.Count>0){for(intindex=0;index<entity.quantity;index++){vardetail=newbus_pro_plan_detail();detail.bodyKeys=Guid.NewGuid();detail.proPlanHeadKeys=entity.keys;detail.workOrderCode=DateTime.Now.ToString("yyyyMMddHHmmss")+getNumber((index+1).ToString());detail.workOrderName=entity.planName+getNumber((index+1).ToString());detail.lineCode=entity.lineCode;detail.productCode=entity.productCode;detail.productName=entity.productName;detail.createBy=sysWebUser?.Account;detail.createTime=DateTime.Now;intcount=0;inti=1;foreach(varmaterialinmaterialList){count+=material.quantityRate.Value;varbom=newbus_pro_plan_detail_bom();bom.bodyKeys=Guid.NewGuid();bom.proPlanHeadKeys=entity.keys;bom.proPlanDetailKeys=detail.bodyKeys;bom.materialCode=material.materialCode;bom.materialName=material.materialName;bom.oprSequenceCode=material.oprSequenceCode;bom.detailSN=DateTime.Now.ToString("yyyyMMddHHmmss")+getNumber((i++).ToString());bom.spec=material.specifications;bom.unit=material.unitCode;bom.productCode=entity.productCode;bom.quantity=material.quantityRate.Value;bom.createBy=sysWebUser?.Account;bom.createTime=DateTime.Now;Context.Insertable(bom).AddQueue();varrel=newbus_pro_plan_detail_bom_rel();rel.proPlanHeadKeys=entity.keys;rel.proPlanDetailBodyKeys=detail.bodyKeys;rel.proPlanDetailBomBodyKeys=bom.bodyKeys;rel.createBy=sysWebUser?.Account;rel.createTime=DateTime.Now;Context.Insertable(rel).AddQueue();}detail.quantity=count;Context.Insertable(detail).AddQueue();}varresultCount=Context.SaveQueues();returnresultCount>0?response.ResponseSuccess():response.ResponseError();}else{returnresponse.ResponseError("查不到产品物料列表,修改错误!");}}}returnresponse;});}///<summary>///更新生产计划工单///</summary>publicdynamicUpdDetail(bus_pro_plan_detailentity){varresponse=newResponse();returnExceptionsHelp.Instance.ExecuteT(()=>{entity.updateBy=sysWebUser?.Account;entity.updateTime=DateTime.Now;response.Status=Context.Updateable(entity).Where(u=>u.id==entity.id).ExecuteCommand()>0;if(!response.Status)response.Message="更新失败";returnresponse;});}///<summary>///更新生产计划工单///</summary>publicdynamicUpdDetailBom(bus_pro_plan_detail_bomentity){varresponse=newResponse();returnExceptionsHelp.Instance.ExecuteT(()=>{entity.updateBy=sysWebUser.Account;entity.updateTime=DateTime.Now;response.Status=Context.Updateable(entity).Where(u=>u.id==entity.id).ExecuteCommand()>0;if(!response.Status)response.Message="更新失败";returnresponse;});}///<summary>///删除生产计划///</summary>///<paramname="ids"></param>///<returns></returns>publicdynamicDelByIds(int[]ids){returnExceptionsHelp.Instance.ExecuteT(()=>{Responseresponse=newResponse();vardataList=Context.Queryable<bus_pro_plan_head>().Where(x=>ids.Contains(x.id)).ToList();boolisSuccess=true;intisDelete=0;for(intindex=0;index<dataList.Count;index++){if(dataList[index].status==initState){isDelete++;Context.Deleteable<bus_pro_plan_head>().Where(x=>x.keys==dataList[index].keys).AddQueue();Context.Deleteable<bus_pro_plan_detail>().Where(x=>x.proPlanHeadKeys==dataList[index].keys).AddQueue();Context.Deleteable<bus_pro_plan_detail_bom>().Where(x=>x.proPlanHeadKeys==dataList[index].keys).AddQueue();Context.Deleteable<bus_pro_plan_detail_bom_rel>().Where(x=>x.proPlanHeadKeys==dataList[index].keys).AddQueue();}else{isSuccess=false;}}varresultCount=Context.SaveQueues();if(!isSuccess){response.ResponseErr("已确认的无法删除!!!!");}elseif(resultCount>0){response.ResponseSuccess("删除成功!已删除【"+isDelete+"】条");}returnresponse;});}publicdynamicDelAllByIds(Guid[]ids){returnExceptionsHelp.Instance.ExecuteT(()=>{Responseresponse=newResponse();vardataList=Context.Queryable<bus_pro_plan_head>().Where(x=>ids.Contains(x.keys)).ToList();boolisSuccess=true;intisDelete=0;for(intindex=0;index<dataList.Count;index++){isDelete++;Context.Deleteable<bus_pro_plan_head>().Where(x=>x.keys==dataList[index].keys).AddQueue();Context.Deleteable<bus_pro_plan_detail>().Where(x=>x.proPlanHeadKeys==dataList[index].keys).AddQueue();Context.Deleteable<bus_pro_plan_detail_bom>().Where(x=>x.proPlanHeadKeys==dataList[index].keys).AddQueue();Context.Deleteable<bus_pro_plan_detail_bom_rel>().Where(x=>x.proPlanHeadKeys==dataList[index].keys).AddQueue();Context.Deleteable<bus_workOrder_head>().Where(x=>x.keys==dataList[index].keys).AddQueue();Context.Deleteable<bus_workOrder_detail>().Where(x=>x.headKeys==dataList[index].keys).AddQueue();}varresultCount=Context.SaveQueues();returnresponse.ResponseSuccess("已删除【"+isDelete+"】条");});}///<summary>///完成生产计划工单///</summary>///<paramname="ids"></param>///<returns></returns>publicdynamicComplete(bus_pro_plan_headentity){returnExceptionsHelp.Instance.ExecuteT(()=>{varresponse=newResponse();vardataObj=Context.Queryable<bus_pro_plan_head>().Where(x=>x.planCode==entity.planCode).First();if(dataObj==null){response.ResponseErr("查询不到计划工单!无法完成工单编制!");returnresponse;}dataObj.status=confirmState;Context.Updateable(dataObj).AddQueue();//找工序为1的varoprSequenceCode="";varoprSequenceName="";varprocessDetailList=Context.Queryable<base_process_route_detail>().Where(x=>x.headkeys==dataObj.processRouteKeys).OrderBy(t=>t.oprSequence).ToList();if(processDetailList.Count>0){oprSequenceCode=processDetailList[0].oprSequenceCode;oprSequenceName=processDetailList[0].oprSequenceName;}//循环工单明细保存工单varplanDetailList=Context.Queryable<bus_pro_plan_detail>().Where(x=>x.proPlanHeadKeys==dataObj.keys).OrderBy(x=>x.workOrderCode,OrderByType.Asc).ToList();foreach(varplanDetailinplanDetailList){varhead=newbus_workOrder_head();head.keys=entity.keys;//取生产计划主表的keyhead.processHeadKeys=dataObj.processRouteKeys;head.productHeaderCode=dataObj.productCode;head.productName=dataObj.productName;head.orderType="3";//通过生产计划生成head.lineCode=dataObj.lineCode;head.nowOprSequenceCode=oprSequenceCode;head.workOrderCode=dataObj.planCode;head.planCode=planDetail.workOrderCode;head.state=(int)EnumOrderHeadStatus.初始化;head.planStartTime=dataObj.planStartTime;head.planEndTime=dataObj.planEndTime;head.isDelete=(int)EnumDeleteOrAdd.新增或更新;head.projectCode=dataObj.projectCode;head.projectName=dataObj.projectName;head.lineNo=dataObj.lineNo;head.edition=dataObj.edition;head.factoryCode=dataObj.factoryCode;head.createBy=sysWebUser?.Account;head.createTime=DateTime.Now;Context.Insertable(head).AddQueue();//保存工单明细foreach(varprocessDetailinprocessDetailList){varlist=Context.Queryable<base_work_center_station_rel>().Where(x=>x.workCenterCode.Equals(processDetail.workCenterCode)).ToList();vari=0;varbomList=Context.Queryable<bus_pro_plan_detail_bom>().Where(x=>x.proPlanDetailKeys==planDetail.bodyKeys&&x.oprSequenceCode==processDetail.oprSequenceCode).ToList();if(bomList.Count==0){response.ResponseErr("工序【"+processDetail.oprSequenceCode+"】无法匹配,请确定是否配置正确!");returnresponse;}foreach(varbomObjectinbomList){for(intindex=0;index<bomObject.quantity;index++){vardetail=newbus_workOrder_detail();detail.bodyKeys=Guid.NewGuid();detail.headKeys=head.keys;detail.serialNumber=processDetail.oprSequence;detail.lineCode=head.lineCode;detail.oprSequenceCode=processDetail.oprSequenceCode;detail.oprSequenceName=processDetail.oprSequenceName;detail.state=(int)EnumOrderBodyStatus.初始化;detail.isRework=false;detail.planStartTime=dataObj.planStartTime;detail.planEndTime=dataObj.planEndTime;detail.productHeaderCode=dataObj.productCode;detail.isDelete=(int)EnumDeleteOrAdd.新增或更新;detail.workOrderCode=head.workOrderCode;detail.barCode=GetBarCode();detail.designUrl=dataObj.designUrl;detail.designNo=dataObj.designNo;if(list.Count==1){detail.stationCode=list[0].workStationCode;}detail.workReportStatus=(int)EnumWorkReportStatus.未报工;detail.workCenterCode=processDetail.workCenterCode;detail.createBy=sysWebUser?.Account;detail.createTime=DateTime.Now;detail.cutMaterCode=bomObject.materialCode;detail.weldMaterCode=bomObject.materialCode;detail.serialNumberName=processDetail.oprSequence.ToString()+"-"+(++i);Context.Insertable(detail).AddQueue();}}}}varresultCount=Context.SaveQueues();returnresultCount>0?response.ResponseSuccess():response.ResponseError();});}publicstringGetBarCode(){varid=Context.Queryable<bus_identify_config>().Max(x=>x.id);if(id==0){//第一次加载添加一行数据默认从1001开始Context.Insertable(newbus_identify_config{id=1001}).ExecuteCommand();id=Context.Queryable<bus_identify_config>().Max(x=>x.id);//取值}returnid.ToString();}}}