config_material_view.js 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036
  1. /**
  2. * Created by zhang on 2019/9/10.
  3. */
  4. let configMaterialObj = {
  5. GLJIDMap:{},
  6. relateFilterAgain:false,
  7. configSpread:null,
  8. relatedSpread:null,
  9. evaluateMaterialDatas:[],
  10. bidMaterialDatas:[],
  11. evaluateMaterialSetting:{
  12. header: [
  13. {headerName: "关联", headerWidth: 80, dataCode: "is_related", dataType: "String",cellType:'checkBox'},
  14. {headerName: "序号", headerWidth: 80, dataCode: "seq", dataType: "String",formatter: "@"},
  15. {headerName: "材料号", headerWidth: 80, dataCode: "code", dataType: "String",formatter: "@"},
  16. {headerName: "材料名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
  17. {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
  18. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  19. {headerName: "数量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",validator:"number"},//decimalField:'glj.quantity'
  20. {headerName: "暂定价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},
  21. {headerName: "合价", headerWidth: 90, dataCode: "totalPrice", hAlign: "right", dataType: "Number",validator:"number",decimalField:'bills.totalPrice'},
  22. {headerName: "锁定", headerWidth: 80, dataCode: "locked", hAlign: "left", dataType: "String",cellType:'checkBox'},
  23. {headerName: "产地", headerWidth: 80, dataCode: "originPlace", hAlign: "left", dataType: "String",visible:false},
  24. {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String",visible:false},
  25. {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
  26. ],
  27. view:{ lockColumns: ["is_related","totalPrice","originPlace","vender","quantity"]}
  28. },
  29. bidMaterialSetting:{
  30. header: [
  31. {headerName: "关联", headerWidth: 80, dataCode: "is_related", dataType: "String",cellType:'checkBox'},
  32. {headerName: "序号", headerWidth: 80, dataCode: "seq", dataType: "String",formatter: "@"},
  33. {headerName: "材料号", headerWidth: 80, dataCode: "code", dataType: "String",formatter: "@"},
  34. {headerName: "材料名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
  35. {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
  36. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  37. {headerName: "数量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",validator:"number"},//decimalField:'glj.quantity'
  38. {headerName: "单价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},
  39. {headerName: "合价", headerWidth: 90, dataCode: "totalPrice", hAlign: "right", dataType: "Number",validator:"number",decimalField:'bills.totalPrice'},
  40. {headerName: "产地", headerWidth: 80, dataCode: "originPlace", hAlign: "left", dataType: "String",visible:false},
  41. {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String",visible:false},
  42. {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
  43. ],
  44. view:{ lockColumns: ["is_related","totalPrice","originPlace","vender","quantity"]}
  45. },
  46. evaluateRelateSetting:{
  47. header: [
  48. {headerName: "关联", headerWidth: 80, dataCode: "is_related", dataType: "String",cellType:'checkBox'},
  49. {headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String"},
  50. {headerName: "类别", headerWidth: 45, dataCode: "short_name" ,hAlign: "center",dataType: "String"},
  51. {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
  52. {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
  53. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  54. {headerName: "数量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
  55. {headerName: "定额价", headerWidth: 70, dataCode: "basePrice", hAlign: "right", dataType: "Number",validator:"number"},
  56. {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},
  57. {headerName: "合价", headerWidth: 90, dataCode: "totalPrice", hAlign: "right", dataType: "Number",validator:"number",decimalField:'bills.totalPrice'},
  58. {headerName: "供货方式", headerWidth: 70, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
  59. {headerName: "产地", headerWidth: 80, dataCode: "originPlace", hAlign: "left", dataType: "String"},
  60. {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String"},
  61. {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
  62. ],
  63. view:{ lockColumns: ["code","type","name","specs","unit","quantity","marketPrice","basePrice","supply","originPlace","vender","remark"]}
  64. },
  65. initSpread:function(){
  66. if(!this.configSpread){
  67. this.configSpread = SheetDataHelper.createNewSpread($("#config_material_sheet")[0],4);
  68. sheetCommonObj.spreadDefaultStyle(this.configSpread);
  69. this.relatedSpread = SheetDataHelper.createNewSpread($("#related_sheet")[0],4);
  70. sheetCommonObj.spreadDefaultStyle(this.relatedSpread);
  71. }
  72. this.initEvaluateMaterialSheet();
  73. this.initbidMaterialSheet();
  74. this.initEvaluateRelateSheet();
  75. //打开别人分享的项目,只读
  76. if(projectReadOnly){
  77. disableSpread(this.configSpread);
  78. disableSpread(this.relatedSpread);
  79. }else {
  80. this.initRightClick();
  81. }
  82. },
  83. initEvaluateMaterialSheet:function(){
  84. this.evaluateMaterialSheet = this.configSpread.getSheet(0);
  85. sheetCommonObj.initSheet(this.evaluateMaterialSheet,this.evaluateMaterialSetting,30);
  86. this.evaluateMaterialSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onEvaluateMaterialValueChange);
  87. this.evaluateMaterialSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onEvaluateMaterialSelectionChange);
  88. this.evaluateMaterialSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onEvaluateMaterialEditStarting);
  89. this.evaluateMaterialSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
  90. this.evaluateMaterialSheet.name('evaluateMaterialSheet');
  91. this.evaluateMaterialSheet.setRowHeight(0, 36, 1);
  92. },
  93. initbidMaterialSheet:function(){
  94. this.bidMaterialSheet = this.configSpread.getSheet(1);
  95. sheetCommonObj.initSheet(this.bidMaterialSheet,this.bidMaterialSetting,30);
  96. this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onBidEvaluateMaterialValueChange);
  97. this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onEvaluateMaterialSelectionChange);
  98. this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onBitMaterialEditStarting);
  99. this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
  100. this.bidMaterialSheet.name('bidMaterialSheet');
  101. this.bidMaterialSheet.setRowHeight(0, 36, 1);
  102. },
  103. initEvaluateRelateSheet:function () {
  104. this.evaluateRelateSheet = this.relatedSpread.getSheet(0);
  105. sheetCommonObj.initSheet(this.evaluateRelateSheet,this.evaluateRelateSetting,30);
  106. this.evaluateRelateSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onEvaluateRelateValueChange);
  107. this.evaluateRelateSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onEvaluateRelateEditStarting);
  108. //this.evaluateRelateSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
  109. this.evaluateRelateSheet.name('evaluateRelateSheet');
  110. this.evaluateRelateSheet.setRowHeight(0, 36, 1);
  111. },
  112. showEvaluateMaterialDatas:function () {
  113. this.configSpread.setActiveSheetIndex(0);
  114. let sel = this.evaluateMaterialSheet.getSelections()[0];
  115. let oldData = sel.row<this.evaluateMaterialDatas.length?this.evaluateMaterialDatas[sel.row]:"";
  116. this.evaluateMaterialDatas = this.getEvaluateMaterialDatas();
  117. sheetCommonObj.showData(this.evaluateMaterialSheet, this.evaluateMaterialSetting,this.evaluateMaterialDatas);
  118. this.evaluateMaterialSheet.setRowCount(this.evaluateMaterialDatas.length);
  119. sel.row = oldData?_.findIndex(this.evaluateMaterialDatas,{'ID':oldData.ID}):'';
  120. this.evaluateMaterialSheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
  121. },
  122. showBidMaterialDatas:function () {
  123. this.configSpread.setActiveSheetIndex(1);
  124. let sel = this.bidMaterialSheet.getSelections()[0];
  125. let oldData = sel.row<this.bidMaterialDatas.length?this.bidMaterialDatas[sel.row]:"";
  126. this.bidMaterialDatas = this.getBidMaterialDatas();
  127. sheetCommonObj.showData(this.bidMaterialSheet, this.bidMaterialSetting,this.bidMaterialDatas);
  128. this.bidMaterialSheet.setRowCount(this.bidMaterialDatas.length);
  129. sel.row = oldData?_.findIndex(this.bidMaterialDatas,{'ID':oldData.ID}):'';
  130. this.bidMaterialSheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
  131. },
  132. showEvaluateRelateDatas:function () {
  133. this.relatedSpread.setActiveSheetIndex(0);
  134. this.evaluateRelateDatas = this.getEvaluateRelateDatas();
  135. sheetCommonObj.showData(this.evaluateRelateSheet, this.evaluateRelateSetting,this.evaluateRelateDatas);
  136. this.evaluateRelateSheet.setRowCount(this.evaluateRelateDatas.length);
  137. },
  138. refreshSheetDatas:function () {
  139. if(projectGljObject.displayType == filterType.ZGCL){
  140. this.showEvaluateMaterialDatas();
  141. }else if(projectGljObject.displayType == filterType.PBCL){
  142. this.showBidMaterialDatas();
  143. }
  144. this.showEvaluateRelateDatas();
  145. },
  146. setNavLinkText:function (type) {
  147. let text = "关联暂估材料";
  148. switch (type){
  149. case filterType.ZGCL:
  150. text = "关联暂估材料";
  151. break;
  152. case filterType.PBCL:
  153. text = "关联评标材料";
  154. break;
  155. case filterType.AMAE:
  156. text = "关联材料";
  157. break;
  158. }
  159. $("#related_link").text(text);
  160. },
  161. getEvaluateRelateDatas:function () {
  162. //$('filterGljName')
  163. let name = '',datas = [],sheet=null,field='',rdata=[];
  164. switch (projectGljObject.displayType){
  165. case filterType.ZGCL:
  166. sheet = this.evaluateMaterialSheet;
  167. datas = this.evaluateMaterialDatas;
  168. field = "is_evaluate";
  169. break;
  170. case filterType.PBCL:
  171. sheet = this.bidMaterialSheet;
  172. datas = this.bidMaterialDatas;
  173. field = "is_eval_material";
  174. break;
  175. case filterType.AMAE:
  176. sheet = materialAdjustObj.getSheet();
  177. datas = materialAdjustObj.getSheetDatas();
  178. field = "is_contractor_material";
  179. }
  180. let sel = sheet.getSelections()[0];
  181. let srow = sel.row == -1||sel.row == ""?0:sel.row;
  182. if(gljUtil.isDef(srow) && datas.length>srow){
  183. name = this.relateFilterAgain== true? $('#filterGljName').val(): datas[srow].name;
  184. rdata = this.filterEvaluateRelate(name,datas[srow].projectGLJID,field);
  185. }
  186. if(this.relateFilterAgain== false) $('#filterGljName').val(name);
  187. return rdata;
  188. },
  189. filterEvaluateRelate:function (name,projectGLJID,relateField) {
  190. let datas = [];
  191. let projectGLJ = projectObj.project.projectGLJ;
  192. let materialIdList = projectGLJ.datas.constData.materialIdList;
  193. for(let d of projectGLJ.datas.gljList){
  194. if (parseFloat(d.quantity) > 0 ){//材料类型//materialIdList.indexOf(d.type) >= 0 &&
  195. if(projectGljObject.displayType != filterType.AMAE){
  196. if(materialIdList.indexOf(d.type) ==-1) continue;
  197. }
  198. if(d[relateField] == 1 && d.id != projectGLJID) continue;//排除其它已被关联的工料机
  199. if(name != ''){//name为''时不做过滤
  200. if(d.name.indexOf(name)==-1){
  201. if(!(d[relateField] == 1 && d.id == projectGLJID)) continue;//虽然不匹配,但是是关联的暂估材料,这时应该显示
  202. }
  203. }
  204. let t = {
  205. id:d.id,
  206. code : d.code,
  207. type : d.type,
  208. short_name :projectGLJ.getShortNameByID(d.type),
  209. name : d.name,
  210. specs : d.specs,
  211. unit : d.unit,
  212. quantity : d.quantity,
  213. supply:d.supply,
  214. originPlace:d.originPlace,
  215. vender:d.vender,
  216. remark:d.remark,
  217. from:d
  218. };
  219. t.is_related = d[relateField]?1:0;
  220. gljOprObj.setGLJPrice(t,d);
  221. t.totalPrice = scMathUtil.roundForObj(t.quantity * t.marketPrice,getDecimal('bills.totalPrice'));
  222. datas.push(t);
  223. }
  224. }
  225. return _.sortByAll(datas,'code');
  226. },
  227. getEvaluateMaterialDatas:function (projectGLJList, evaluateList, decimalObj) {
  228. projectGLJList = projectGLJList ? projectGLJList : projectObj.project.projectGLJ.datas.gljList;
  229. evaluateList = evaluateList ? evaluateList : projectObj.project.evaluate_list.datas;
  230. const billsDecimal = decimalObj ? decimalObj.bills.totalPrice : getDecimal('bills.totalPrice');
  231. let datas = [];
  232. let gljMap = _.indexBy(projectGLJList,'id');
  233. for(let e of evaluateList){
  234. let t = {
  235. ID:e.ID,
  236. projectID: e.projectID,
  237. is_related:e.is_related,//关联,1关,0不关
  238. projectGLJID:e.projectGLJID,//关联工料机ID
  239. seq:e.seq,//序号
  240. code:e.code,
  241. name:e.name,
  242. specs:e.specs,
  243. unit:e.unit,
  244. type:e.type,
  245. marketPrice:e.market_price,
  246. quantity:e.quantity,
  247. locked:e.locked,//锁定,1锁,0不锁
  248. remark:e.remark,
  249. originPlace:e.originPlace,//产地
  250. vender:e.vender //厂家
  251. };
  252. let pglj = gljMap[e.projectGLJID];
  253. if(e.is_related && pglj){
  254. gljOprObj.setGLJPrice(t,pglj);
  255. t.originPlace = pglj.originPlace;
  256. t.vender = pglj.vender;
  257. t.brand = pglj.brand;
  258. t.qualityGrace = pglj.qualityGrace;
  259. t.remark = pglj.remark;
  260. t.quantity = pglj.quantity;
  261. }
  262. t.totalPrice = scMathUtil.roundForObj(parseFloat(t.quantity) * parseFloat(t.marketPrice) ,billsDecimal);
  263. datas.push(t);
  264. }
  265. return _.sortByAll(datas,'code');
  266. },
  267. getBidMaterialDatas:function (projectGLJList, bidEvaluationList, decimalObj) {
  268. projectGLJList = projectGLJList ? projectGLJList : projectObj.project.projectGLJ.datas.gljList;
  269. bidEvaluationList = bidEvaluationList ? bidEvaluationList : projectObj.project.bid_evaluation_list.datas;
  270. const billsDecimal = decimalObj ? decimalObj.bills.totalPrice : getDecimal('bills.totalPrice');
  271. let datas = [];
  272. let gljMap = _.indexBy(projectGLJList,'id');
  273. for(let e of bidEvaluationList){
  274. let t = {
  275. ID:e.ID,
  276. projectID: e.projectID,
  277. is_related:e.is_related,//关联,1关,0不关
  278. projectGLJID:e.projectGLJID,//关联工料机ID
  279. seq:e.seq,//序号
  280. code:e.code,
  281. name:e.name,
  282. specs:e.specs,
  283. unit:e.unit,
  284. type:e.type,
  285. marketPrice:e.market_price,
  286. quantity:e.quantity,
  287. remark:e.remark,
  288. originPlace:e.originPlace,//产地
  289. is_evaluate:0,
  290. vender:e.vender //厂家
  291. };
  292. let pglj = gljMap[e.projectGLJID];
  293. if(e.is_related && pglj){
  294. gljOprObj.setGLJPrice(t,pglj);
  295. t.originPlace = pglj.originPlace;
  296. t.vender = pglj.vender;
  297. t.brand = pglj.brand;
  298. t.qualityGrace = pglj.qualityGrace;
  299. t.quantity = pglj.quantity;
  300. t.is_evaluate = pglj.is_evaluate;
  301. }
  302. t.totalPrice = scMathUtil.roundForObj(parseFloat(t.quantity) * parseFloat(t.marketPrice) ,billsDecimal);
  303. datas.push(t);
  304. }
  305. return _.sortByAll(datas,'code');
  306. },
  307. updateConfigMaterial:function (dataCode,value,recode) {
  308. let task = [];
  309. for(let t of projectObj.project.projectGLJ.datas.gljList){
  310. this.GLJIDMap[t.id] = t;
  311. }
  312. let glj = this.GLJIDMap[recode.id];
  313. if(!glj) return;
  314. let pdata = {doc:{},action:'update'};
  315. pdata['type'] = 'glj_list';
  316. pdata.doc[dataCode] = value;
  317. pdata['id'] = glj.id;
  318. task.push(pdata);
  319. this.getEvaluateUpdateTasks(value,glj,dataCode,task);
  320. this.updateEvaluateMaterial(task,dataCode == "is_evaluate");
  321. },
  322. updateEvaluateMaterial :async function(data,refreshEvaluate=true){
  323. try {
  324. $.bootstrapLoading.start();
  325. let result = await ajaxPost('/glj/updateEvaluateMaterial',{tasks:data});
  326. //先刷新缓存
  327. let [gljs,sendPriceChange] = this.refreshCache(data);
  328. if(refreshEvaluate == true){
  329. let [rationNodes,impactGLJs] = projectObj.project.projectGLJ.batchChangeIsEvaluate(gljs);
  330. projectObj.project.calcProgram.calcNodesAndSave(rationNodes, function () {
  331. projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots);
  332. });
  333. }
  334. projectGljObject.refreshViewsData();
  335. gljOprObj.refreshView();
  336. if(sendPriceChange == true) projectGljObject.onUnitFileChange();
  337. }catch (e){
  338. console.log(e)
  339. }finally {
  340. $.bootstrapLoading.end();
  341. }
  342. },
  343. refreshCache:function (tasks) {
  344. let gljs = [];
  345. let sendPriceChange = false;
  346. for(let t of tasks){
  347. if(t.type == "evaluate_list"){
  348. refreshDatas(projectObj.project.evaluate_list.datas,t);
  349. }else if(t.type == "bid_evaluation_list"){
  350. refreshDatas(projectObj.project.bid_evaluation_list.datas,t);
  351. }else if(t.type == "contractor_list"){
  352. refreshDatas(projectObj.project.contractor_list.datas,t);
  353. } else {
  354. if(_.isEmpty(this.GLJIDMap)) this.GLJIDMap = _.indexBy(projectObj.project.projectGLJ.datas.gljList,'id');
  355. //剩下两个类型只有更新操作
  356. if(t.type == "unit_price"){
  357. let g = this.GLJIDMap[t.projectGLJID];
  358. if(g) {
  359. let f = updateProperty(g.unit_price,t.doc);
  360. if(f == true) sendPriceChange = true;
  361. gljs.push(g);
  362. }
  363. }
  364. if(t.type == "glj_list"){
  365. let g = this.GLJIDMap[t.id];
  366. if(g){
  367. let f = updateProperty(g,t.doc);
  368. if(f == true) sendPriceChange = true;
  369. gljs.push(g);
  370. }
  371. }
  372. }
  373. }
  374. this.GLJIDMap = {};
  375. return [gljs,sendPriceChange];
  376. function refreshDatas(datas,t_t) {
  377. if(t_t.action == "update"){
  378. let e = _.find(datas,{'ID':t_t.ID});
  379. if(e) updateProperty(e,t_t.doc);
  380. }
  381. if(t_t.action == "add") datas.push(t_t.doc);
  382. if(t_t.action == "delete") _.remove(datas,{'ID':t_t.ID});
  383. }
  384. function updateProperty(obj,doc) {
  385. let updatePrice = false;
  386. for(let k in doc){
  387. obj[k] = doc[k];
  388. if(k == 'base_price' || k == 'market_price') updatePrice = true;
  389. }
  390. return updatePrice;
  391. }
  392. },
  393. getEvaluateUpdateTasks:function (value,glj,dataCode,task) {
  394. let dataList = [],modelType='evaluate_list';
  395. if(dataCode == 'is_evaluate'){
  396. dataList = projectObj.project.evaluate_list.datas;
  397. modelType = 'evaluate_list';
  398. }else if(dataCode == 'is_eval_material'){
  399. dataList = projectObj.project.bid_evaluation_list.datas;
  400. modelType = 'bid_evaluation_list';
  401. }
  402. if(value == 1){ //勾选暂估选项,查看已有的暂估材料列表中是否有名称,编号等完全相同的记录,有则直接关联,无则添加
  403. let evaluate = null;
  404. let pindex = gljUtil.getIndex(glj,gljUtil.materialKeyArray);
  405. for(let e of dataList){
  406. let eIndex = gljUtil.getIndex(e,gljUtil.materialKeyArray);
  407. if(pindex == eIndex){
  408. evaluate = e;
  409. break;
  410. }
  411. }
  412. if(evaluate){//有找到则更新,没有则添加
  413. let edata = {type:modelType,doc:{},action:"update",ID:evaluate.ID};
  414. edata.doc = {projectGLJID:glj.id,is_related:1};
  415. task.push(edata);
  416. if(dataCode == 'is_evaluate'){
  417. let udata = {type:'unit_price',doc:{},action:"update",projectGLJID:glj.id,id : glj.unit_price.id};
  418. //if(evaluate.base_price != glj.unit_price.base_price) udata.doc['base_price'] = evaluate.base_price;
  419. if(evaluate.market_price != glj.unit_price.market_price) udata.doc['market_price'] = evaluate.market_price;
  420. if(!_.isEmpty(udata.doc)) task.push(udata);
  421. }
  422. }else {
  423. let ndata = {type:modelType,doc:{},action:"add"};
  424. ndata.doc['ID'] = uuid.v1();
  425. ndata.doc['projectGLJID'] = glj.id;
  426. ndata.doc['is_related'] = 1;
  427. if(dataCode == 'is_evaluate') ndata.doc['locked'] = 0;
  428. ndata.doc['seq'] = glj.code;
  429. ndata.doc['projectID'] = glj.project_id;
  430. ndata.doc['code'] = glj.code;
  431. ndata.doc['name'] = glj.name;
  432. ndata.doc['specs'] = glj.specs;
  433. ndata.doc['unit'] = glj.unit;
  434. ndata.doc['quantity'] = glj.quantity;
  435. ndata.doc['type'] = glj.type;
  436. ndata.doc['market_price'] = glj.unit_price.market_price;
  437. ndata.doc['originPlace'] = glj.originPlace;
  438. ndata.doc['vender'] = glj.vender;
  439. ndata.doc['remark'] = glj.remark;
  440. task.push(ndata);
  441. }
  442. }else if(value == 0){
  443. let t_evaluate = null;
  444. for(let e of dataList){
  445. if(e.projectGLJID == glj.id && e.is_related == 1){
  446. t_evaluate = e;
  447. break;
  448. }
  449. }
  450. if(t_evaluate){
  451. let tdata = {type:modelType,doc:{is_related:0,quantity:'0'},action:"update",ID:t_evaluate.ID};
  452. task.push(tdata);
  453. }
  454. }
  455. },
  456. onEvaluateMaterialSelectionChange:function (sender, args) {
  457. let me = configMaterialObj;
  458. let newSel = args.newSelections[0];
  459. let oldSel = args.oldSelections?args.oldSelections[0]:{};
  460. if(newSel.row != oldSel.row){
  461. me.showEvaluateRelateDatas();
  462. me.relateFilterAgain = false;
  463. }
  464. },
  465. onBidEvaluateMaterialValueChange:function (e,info) {
  466. let me = configMaterialObj,row = info.row, col = info.col;
  467. let dataCode = me.bidMaterialSetting.header[col].dataCode;
  468. let value = info.newValue;
  469. let bid = me.bidMaterialDatas[row];
  470. if (value&&! sheetCommonObj.checkData(col,me.bidMaterialSetting,value)) {
  471. alert('输入的数据类型不对,请重新输入!');
  472. return me.showBidMaterialDatas();
  473. }
  474. if(dataCode == 'marketPrice'){
  475. dataCode = 'market_price';
  476. if(bid.is_related){//关联的情况下,直接修改工料机价格
  477. if(bid.is_evaluate == 1){
  478. alert("当前材料市场价已被锁定,修改请先返回人材机汇总界面解除锁定。");
  479. return me.showBidMaterialDatas();
  480. }
  481. return projectObj.project.projectGLJ.updatePrice(bid,dataCode,value,'rg', null,projectGljObject.refreshViewsData);
  482. }
  483. value = scMathUtil.roundToString(value,getDecimal('glj.unitPrice'));
  484. }
  485. if(value&& dataCode === 'quantity'){//修改数量需做4舍5入
  486. value = scMathUtil.roundToString(value,getDecimal('glj.quantity'));
  487. }
  488. let edata = {type:'bid_evaluation_list',doc:{},action:"update",ID:bid.ID};
  489. if(bid[dataCode] == value) return me.showBidMaterialDatas();
  490. edata.doc[dataCode] = value;
  491. me.updateEvaluateMaterial([edata],false);
  492. },
  493. onSheetRangeChange:function (e,args) {
  494. let me = configMaterialObj,updateMap = {},modelType='',setting={},datas = [],tasks = [];
  495. switch (projectGljObject.displayType){
  496. case filterType.ZGCL:
  497. modelType="evaluate_list";
  498. setting = me.evaluateMaterialSetting;
  499. datas = me.evaluateMaterialDatas;
  500. break;
  501. case filterType.PBCL:
  502. modelType="bid_evaluation_list";
  503. setting = me.bidMaterialSetting;
  504. datas = me.bidMaterialDatas;
  505. break;
  506. }
  507. for(let c of args.changedCells){
  508. let dataCode = setting.header[c.col].dataCode;
  509. let value= args.sheet.getCell(c.row, c.col).text();
  510. let recode = datas[c.row];
  511. if(me.editChecking(recode,dataCode,modelType == "evaluate_list")==false){
  512. me.refreshSheetDatas();
  513. return ;
  514. }
  515. if (value&&!sheetCommonObj.checkData(c.col,setting,value)) {
  516. alert('输入的数据类型不对,请重新输入!');
  517. me.refreshSheetDatas();
  518. return ;
  519. }
  520. if(dataCode=='marketPrice'){
  521. dataCode = 'market_price';
  522. if(recode.is_related){//关联的情况下,直接修改工料机价格 暂时不支持批量修改
  523. return projectObj.project.projectGLJ.updatePrice(recode,dataCode,value,'rg',null,projectGljObject.refreshViewsData);
  524. }
  525. }else {
  526. let tem = updateMap[recode.ID]?updateMap[recode.ID]:{};
  527. if(value&&dataCode === 'quantity') value = scMathUtil.roundToString(value,getDecimal('glj.quantity'));//修改数量需做4舍5入
  528. if(value == recode[dataCode]) continue;
  529. tem[dataCode] = value;
  530. updateMap[recode.ID] = tem;
  531. }
  532. }
  533. for(let ID in updateMap){
  534. let edata = {type:modelType,doc:updateMap[ID],action:"update",ID:ID};
  535. tasks.push(edata);
  536. }
  537. if(tasks.length > 0) me.updateEvaluateMaterial(tasks,false);
  538. },
  539. onEvaluateMaterialValueChange:function (e,info) {
  540. let me = configMaterialObj,row = info.row, col = info.col;
  541. let dataCode = me.evaluateMaterialSetting.header[col].dataCode;
  542. let value = info.newValue;
  543. let evaluate = me.evaluateMaterialDatas[row];
  544. if (value&&! sheetCommonObj.checkData(col,me.evaluateMaterialSetting,value)) {
  545. alert('输入的数据类型不对,请重新输入!');
  546. return me.showEvaluateMaterialDatas();
  547. }
  548. if(dataCode == 'locked') value = value == true?1:0;
  549. if(dataCode == 'marketPrice'){
  550. dataCode = 'market_price';
  551. if(evaluate.is_related){//关联的情况下,直接修改工料机价格
  552. return projectObj.project.projectGLJ.updatePrice(evaluate,dataCode,value,'rg',null,projectGljObject.refreshViewsData);
  553. }
  554. }
  555. if(value && dataCode === 'quantity'){//修改数量需做4舍5入
  556. value= scMathUtil.roundToString(value,getDecimal('glj.quantity'));
  557. }
  558. let edata = {type:'evaluate_list',doc:{},action:"update",ID:evaluate.ID};
  559. if(evaluate[dataCode] == value) return me.showEvaluateMaterialDatas();
  560. edata.doc[dataCode] = value;
  561. me.updateEvaluateMaterial([edata],false);
  562. },
  563. onEvaluateRelateValueChange:function (e,info){
  564. let me = configMaterialObj,row = info.row, col = info.col;
  565. let value = info.newValue;
  566. let sheet = null,datas = [],field = "",type="";
  567. switch (projectGljObject.displayType){
  568. case filterType.ZGCL:
  569. sheet = me.evaluateMaterialSheet;
  570. datas = me.evaluateMaterialDatas;
  571. field = "is_evaluate";
  572. type="evaluate_list";
  573. break;
  574. case filterType.PBCL:
  575. sheet = me.bidMaterialSheet;
  576. datas = me.bidMaterialDatas;
  577. field = "is_eval_material";
  578. type="bid_evaluation_list";
  579. break;
  580. case filterType.AMAE:
  581. sheet = materialAdjustObj.getSheet();
  582. datas = materialAdjustObj.getSheetDatas();
  583. field = "is_contractor_material";
  584. type = "contractor_list";
  585. }
  586. let sel = sheet.getSelections()[0];
  587. let srow = sel.row == -1||sel.row == ""?0:sel.row;
  588. let task = [];
  589. value = value == true?1:0;
  590. if(datas.length>srow){
  591. let evaluate = datas[srow];
  592. let relate = me.evaluateRelateDatas[row];
  593. let pdata = {id:relate.id,doc:{},action:'update',type:"glj_list"};
  594. pdata.doc[field] = value;
  595. task.push(pdata);
  596. let tdata = {type:type,doc:{},action:"update",ID:evaluate.ID};
  597. if(value == 0){//如果是0的话
  598. tdata.doc = {is_related:0,quantity:'0'};
  599. }else {
  600. if(relate.unit != evaluate.unit){//检查单位是否相同,如果不同不能关联
  601. alert("单位不一致,不允许关联!");
  602. return me.showEvaluateRelateDatas();
  603. }
  604. //如果已经关联了其它项目工料机,要把那个项目工料机的是否暂估标记为否
  605. if(evaluate.is_related == 1){
  606. let tdoc = {};
  607. tdoc[field] = 0;
  608. task.push({id:evaluate.projectGLJID,doc:tdoc,action:'update',type:"glj_list"});
  609. }
  610. //更新暂估材料的工料机ID,和关联标记
  611. tdata.doc = {projectGLJID:relate.id,is_related:1};
  612. if(projectGljObject.displayType == filterType.ZGCL){
  613. //更新新关联工料机的市场价格
  614. let udata = {type:'unit_price',doc:{},action:"update",projectGLJID:relate.from.id,id : relate.from.unit_price.id};
  615. //if(evaluate.base_price != relate.from.unit_price.base_price) udata.doc['base_price'] = evaluate.base_price;
  616. if(evaluate.marketPrice != relate.from.unit_price.market_price) udata.doc['market_price'] = evaluate.marketPrice;
  617. if(!_.isEmpty(udata.doc)) task.push(udata);
  618. }
  619. }
  620. task.push(tdata);
  621. me.updateEvaluateMaterial(task);
  622. }
  623. },
  624. deleteMaterial:function (row) {
  625. let me = configMaterialObj;
  626. let evaluate = {},task=[],type='',field='';
  627. switch (projectGljObject.displayType){
  628. case filterType.ZGCL:
  629. evaluate = me.evaluateMaterialDatas[row];
  630. field = "is_evaluate";
  631. type="evaluate_list";
  632. break;
  633. case filterType.PBCL:
  634. evaluate = me.bidMaterialDatas[row];
  635. field = "is_eval_material";
  636. type="bid_evaluation_list";
  637. break;
  638. case filterType.AMAE:
  639. let t_datas = materialAdjustObj.getSheetDatas();
  640. evaluate = t_datas[row];
  641. field = "is_contractor_material";
  642. type="contractor_list";
  643. }
  644. if(evaluate){
  645. task.push({type:type,action:"delete",ID:evaluate.ID});
  646. if(evaluate.is_related == 1){//如果关联了工料机,则要把工料机标记为不是暂估
  647. let tdoc = {};
  648. tdoc[field] = 0;
  649. task.push({id:evaluate.projectGLJID,doc:tdoc,action:'update',type:"glj_list"})
  650. }
  651. me.updateEvaluateMaterial(task);
  652. }
  653. },
  654. onEvaluateMaterialEditStarting:function (sender, args) {
  655. let me = configMaterialObj;
  656. let row = args.row,col = args.col;
  657. let evaluate = me.evaluateMaterialDatas[row];
  658. let dataCode = me.evaluateMaterialSetting.header[col].dataCode;
  659. if(me.editChecking(evaluate,dataCode,true)==false) args.cancel = true;
  660. },
  661. editChecking:function (record,dataCode,checkLock = false) {//return false 为不能编辑
  662. if(checkLock && record.locked) return false;
  663. if((dataCode == 'quantity'||dataCode == 'unit') && record.is_related) return false;//在关联的情况下,数量和单位不可编辑
  664. return true;
  665. },
  666. onBitMaterialEditStarting:function (sender, args) {
  667. let me = configMaterialObj;
  668. let row = args.row,col = args.col;
  669. let bid = me.bidMaterialDatas[row];
  670. let dataCode = me.bidMaterialSetting.header[col].dataCode;
  671. if(me.editChecking(bid,dataCode)==false) args.cancel = true;
  672. },
  673. onEvaluateRelateEditStarting:function (sender, args) {
  674. let me = configMaterialObj;
  675. let row = args.row,col = args.col;
  676. args.cancel = true;
  677. },
  678. insertEmptyRow:function () {
  679. let m_t = "";
  680. switch (projectGljObject.displayType){
  681. case filterType.ZGCL:
  682. m_t="evaluate_list";
  683. break;
  684. case filterType.PBCL:
  685. m_t="bid_evaluation_list";
  686. break;
  687. }
  688. let ndata = {type:m_t,doc:{},action:"add"};
  689. ndata.doc['ID'] = uuid.v1();
  690. ndata.doc['is_related'] = 0;
  691. if(m_t == "evaluate_list")ndata.doc['locked'] = 0;
  692. ndata.doc['seq'] = "";
  693. ndata.doc['projectID'] = projectObj.project.ID();
  694. ndata.doc['code'] = "";
  695. ndata.doc['name'] = "";
  696. ndata.doc['unit'] = "";
  697. ndata.doc['originPlace'] = "";
  698. ndata.doc['vender'] = "";
  699. ndata.doc['remark'] = "";
  700. configMaterialObj.updateEvaluateMaterial([ndata],false);
  701. },
  702. initRightClick : function() {
  703. let me = this;
  704. $.contextMenu({
  705. selector: '#config_material_sheet',
  706. build: function ($trigger, e) {
  707. me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, me.configSpread);
  708. return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport ||
  709. me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
  710. },
  711. items: {
  712. "addFromGLJ":{
  713. name: '从人材机汇总中选择',
  714. icon: 'fa-sign-in',
  715. disabled: function () {
  716. return false;
  717. },
  718. callback: function (key, opt) {
  719. if(projectGljObject.displayType == filterType.AMAE){
  720. materialAdjustObj.checkedDefualtOption("glj_sel_input");
  721. $("#selectFromGLJ").modal('show');
  722. }else {
  723. materialAdjustObj.checkedDefualtOption("pglj_sel_input");
  724. $("#selectPGLJ").modal('show');
  725. }
  726. }
  727. },
  728. "insertRow":{
  729. name: '插入',
  730. icon: 'fa-sign-in',
  731. disabled: function () {
  732. return false;
  733. },
  734. callback: function (key, opt) {
  735. if(projectGljObject.displayType == filterType.AMAE){
  736. materialAdjustObj.insertEmptyRow();
  737. }else {
  738. configMaterialObj.insertEmptyRow();
  739. }
  740. }
  741. },
  742. "deleteAdjust": {
  743. name: "删除",
  744. icon: 'fa-trash-o',
  745. disabled: function () {
  746. return me.rightClickTarget.row === undefined;
  747. },
  748. callback: function (key, opt) {
  749. let row = me.rightClickTarget.row;
  750. me.deleteMaterial(row);
  751. }
  752. }
  753. }
  754. });
  755. }
  756. };
  757. let pgljSelObj={
  758. spread:null,
  759. sheet:null,
  760. datas:[],
  761. setting:{
  762. header: [
  763. {headerName: "选择", headerWidth: 45, dataCode: "select", hAlign: "center", dataType: "String",cellType:'checkBox'},
  764. {headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String"},
  765. {headerName: "类型", headerWidth: 30, dataCode: "short_name", hAlign: "center", dataType: "String"},
  766. {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
  767. {headerName: "规格型号", headerWidth: 100, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
  768. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  769. {headerName: "总消耗量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
  770. {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
  771. {headerName: "供货方式", headerWidth: 70, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
  772. {headerName: "暂估", headerWidth: 45, dataCode: "is_evaluate", hAlign: "center", dataType: "String",cellType:'checkBox'},
  773. {headerName: "产地", headerWidth: 80, dataCode: "originPlace", hAlign: "left", dataType: "String"},
  774. {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String"},
  775. {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
  776. ],
  777. view: {
  778. lockColumns: ["is_evaluate"]
  779. }
  780. },
  781. checkType:"取消",//记住点击过的按钮的text
  782. initSpread:function () {
  783. if(!this.spread){
  784. this.spread = SheetDataHelper.createNewSpread($("#pglj_from_sheet")[0]);
  785. sheetCommonObj.spreadDefaultStyle(this.spread);
  786. }else {
  787. this.spread.refresh();
  788. }
  789. this.sheet = this.spread.getSheet(0);
  790. sheetCommonObj.initSheet(this.sheet,this.setting);
  791. this.sheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onEditStarting);
  792. this.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, this.onClipboardPasting);
  793. this.sheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onValueChanged);
  794. this.sheet.setRowHeight(0, 36, 1);
  795. disableRightMenu("pglj_from_sheet",this.spread);
  796. },
  797. onEditStarting:function (e,args) {
  798. args.cancel = true;
  799. },
  800. onClipboardPasting:function (e,args) {
  801. args.cancel = true;
  802. },
  803. onValueChanged:function (e,args) {
  804. let me = pgljSelObj;
  805. let value = args.newValue;
  806. value = value == true?1:0;
  807. me.datas[args.row].select = value;
  808. },
  809. showDatas:function () {
  810. this.datas = [];
  811. let gljList = projectObj.project.projectGLJ.datas.gljList;
  812. gljList = this.filterGLJ(gljList);
  813. gljList = sortProjectGLJ(gljList);
  814. for(let glj of gljList){
  815. this.datas.push(this.getSheetDatas(glj));
  816. }
  817. this.refreshDatas();
  818. },
  819. filterGLJ:function (gljList) {
  820. let typeMap = {};
  821. for(let ch of $(".pglj_sel_input:checked")){
  822. typeMap[$(ch).val()] = true;
  823. }
  824. let inputV = $("#pglj_sel_input").val();
  825. return _.filter(gljList,function (item) {
  826. if(item.quantity === 0 || item.quantity === '0') return false;
  827. let firstS = (item.type+"").substring(0,1);
  828. if(!typeMap[firstS]) return false;
  829. if(inputV!=""){//输入的关键字过滤
  830. if(item.code.indexOf(inputV)==-1 && item.name.indexOf(inputV)==-1) return false
  831. }
  832. return true;
  833. });
  834. },
  835. refreshDatas:function () {
  836. this.checkByType(this.checkType);
  837. sheetCommonObj.showData(this.sheet, this.setting,this.datas);
  838. this.sheet.setRowCount(this.datas.length);
  839. },
  840. getSheetDatas(glj){
  841. let projectGLJ = projectObj.project.projectGLJ;
  842. let materialIdList = projectGLJ.datas.constData.materialIdList;
  843. let data = materialAdjustObj.getCommonObject(glj);
  844. console.log(projectGljObject.displayType);
  845. data.select = projectGljObject.displayType == filterType.ZGCL?glj.is_evaluate:glj.is_eval_material;
  846. data.from = glj;
  847. data.short_name = projectGLJ.getShortNameByID(glj.type);
  848. // 只有材料才显示是否暂估
  849. // if (materialIdList.indexOf(glj.type) >= 0) data.is_evaluate = glj.is_evaluate;
  850. data.is_eval_material = glj.is_eval_material;
  851. data.is_evaluate = glj.is_evaluate;
  852. return data;
  853. },
  854. checkByType:function (type) {
  855. for(let d of this.datas){
  856. d.select = 0;
  857. switch (type){
  858. case "全选":
  859. d.select = 1;
  860. break;
  861. case "全选主材":
  862. if(d.type == 4) d.select = 1;
  863. break;
  864. case "全选设备":
  865. if(d.type == 5) d.select = 1;
  866. break;
  867. case "取消":
  868. d.select = projectGljObject.displayType == filterType.ZGCL?d.is_evaluate:d.is_eval_material;
  869. break;
  870. }
  871. }
  872. //this.refreshDatas();
  873. },
  874. confirmSelect:function () {
  875. let tasks = [];
  876. let datas = [],modelType= '',field= '';
  877. switch (projectGljObject.displayType){
  878. case filterType.ZGCL:
  879. datas = projectObj.project.evaluate_list.datas;
  880. field = "is_evaluate";
  881. modelType="evaluate_list";
  882. break;
  883. case filterType.PBCL:
  884. datas =projectObj.project.bid_evaluation_list.datas;
  885. field = "is_eval_material";
  886. modelType="bid_evaluation_list";
  887. break;
  888. }
  889. let evaluateMap = _.indexBy(datas,"projectGLJID");
  890. let evaluateKeyMap = {};//关键字映射表
  891. for(let e of datas){
  892. let eIndex = gljUtil.getIndex(e,gljUtil.materialKeyArray);
  893. evaluateKeyMap[eIndex] = e;
  894. }
  895. for(let d of this.datas){
  896. if(d.select == 1){//如果是选中状态
  897. if(d[field] == 1) {//如果已经标记为暂估或评标材料,查看是否已经存在关联的材料
  898. let evl = evaluateMap[d.id];
  899. if(evl){
  900. //这里应该是错误检查的保证,按正常是不应该出现这种情况的
  901. if(evl.is_related !=1) tasks.push({type:modelType,doc:{projectGLJID:d.id,is_related:1},action:"update",ID:evl.ID});
  902. }else {
  903. tasks.push(getNewEval(d,modelType))
  904. }
  905. }else {//如果不是暂估,要改成暂估
  906. let pdata = {id:d.id,doc:{},action:'update',type:"glj_list"};
  907. pdata.doc[field] = 1;
  908. tasks.push(pdata);
  909. let evaluate = evaluateKeyMap[gljUtil.getIndex(d,gljUtil.materialKeyArray)];
  910. if(evaluate) {//如果已经存在5个关键字相同的暂估材料,则自动关联起来
  911. let edata = {type:modelType,doc:{projectGLJID:d.id,is_related:1},action:"update",ID:evaluate.ID};
  912. tasks.push(edata);
  913. if(modelType == 'evaluate_list'){
  914. let udata = {type:'unit_price',doc:{},action:"update",projectGLJID:d.id,id : d.from.unit_price.id};
  915. if(evaluate.market_price != d.from.unit_price.market_price) udata.doc['market_price'] = evaluate.market_price;
  916. if(!_.isEmpty(udata.doc)) tasks.push(udata);
  917. }
  918. }else {//如果不存在,则生成一条新的
  919. tasks.push(getNewEval(d,modelType));
  920. }
  921. }
  922. }else {//未选中状态的,检查一下是否存在关联的情况,取消关联
  923. let tdoc = {};
  924. tdoc[field] = 0;
  925. if(d[field] == 1) tasks.push({id:d.id,doc:tdoc,action:'update',type:"glj_list"});
  926. let evl = evaluateMap[d.id];
  927. if(evl){
  928. if(evl.is_related ==1) tasks.push({type:modelType,doc:{is_related:0},action:"update",ID:evl.ID});
  929. }
  930. let evaluate = evaluateKeyMap[gljUtil.getIndex(d,gljUtil.materialKeyArray)];
  931. if(evaluate) {
  932. if(evaluate.is_related ==1) tasks.push({type:modelType,doc:{is_related:0},action:"update",ID:evaluate.ID});
  933. }
  934. }
  935. }
  936. if(tasks.length > 0) configMaterialObj.updateEvaluateMaterial(tasks);
  937. function getNewEval(d,m_t) {
  938. let ndata = {type:m_t,doc:{},action:"add"};
  939. ndata.doc['ID'] = uuid.v1();
  940. ndata.doc['projectGLJID'] = d.id;
  941. ndata.doc['is_related'] = 1;
  942. if(m_t == "evaluate_list")ndata.doc['locked'] = 0;
  943. ndata.doc['seq'] = d.code;
  944. ndata.doc['projectID'] = d.from.project_id;
  945. ndata.doc['code'] = d.code;
  946. ndata.doc['name'] = d.name;
  947. ndata.doc['specs'] = d.specs;
  948. ndata.doc['unit'] = d.unit;
  949. ndata.doc['quantity'] = d.quantity;
  950. ndata.doc['type'] = d.type;
  951. ndata.doc['market_price'] = d.from.unit_price.market_price;
  952. ndata.doc['originPlace'] = d.originPlace;
  953. ndata.doc['vender'] = d.vender;
  954. ndata.doc['remark'] = d.remark;
  955. return ndata;
  956. }
  957. }
  958. };
  959. $(function () {
  960. $("#filterAgain").click(function(){
  961. configMaterialObj.relateFilterAgain = true;//重新过滤标记
  962. configMaterialObj.showEvaluateRelateDatas();
  963. })
  964. $('#selectPGLJ').on('shown.bs.modal',function(e){
  965. pgljSelObj.checkType="取消";
  966. pgljSelObj.initSpread();
  967. pgljSelObj.showDatas();
  968. });
  969. $(".pglj_sel_input").change(function () {
  970. let check = $(this).prop("checked");
  971. if($(this).val() == 0){//勾选的是全选,其它的勾选项跟着改变
  972. for(let a of $(".pglj_sel_input")){
  973. $(a).prop("checked",check)
  974. }
  975. }else {//勾选其它选项
  976. let a_checked = true;
  977. for(let o of $(".pglj_sel_input_other")){//如果其它的有一个不勾选,则所有项也不打勾
  978. if($(o).prop("checked") === false){
  979. a_checked = false;
  980. break;
  981. }
  982. }
  983. $("#pglj_sel_all").prop("checked",a_checked);
  984. }
  985. pgljSelObj.showDatas();
  986. });
  987. $("#pglj_sel_btn_find").click(function () {
  988. pgljSelObj.showDatas();
  989. });
  990. $(".pglj_sel_check_btn").click(function () {
  991. pgljSelObj.checkType = $(this).text();
  992. pgljSelObj.refreshDatas();
  993. })
  994. $("#pglj_sel_confirm").click(function () {
  995. pgljSelObj.confirmSelect();
  996. })
  997. });