config_material_view.js 44 KB

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