material_adjust_view.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911
  1. /**
  2. * Created by zhang on 2019/5/15.
  3. */
  4. let materialAdjustObj = {
  5. spread: null,
  6. priceInfoSheet: null,
  7. priceCoeSheet: null,
  8. priceInfoDatas: [],
  9. priceCoeDatas: [],
  10. priceInfoSetting: {
  11. header: [{
  12. headerName: "关联",
  13. headerWidth: 80,
  14. dataCode: "is_related",
  15. dataType: "String",
  16. cellType: 'checkBox'
  17. },
  18. {
  19. headerName: "材料号",
  20. headerWidth: 80,
  21. dataCode: "code",
  22. dataType: "String"
  23. },
  24. {
  25. headerName: "材料名称",
  26. headerWidth: 160,
  27. dataCode: "name",
  28. dataType: "String",
  29. cellType: 'tipsCell'
  30. },
  31. {
  32. headerName: "规格型号",
  33. headerWidth: 120,
  34. dataCode: "specs",
  35. hAlign: "left",
  36. dataType: "String",
  37. cellType: 'tipsCell'
  38. },
  39. {
  40. headerName: "单位",
  41. headerWidth: 45,
  42. dataCode: "unit",
  43. hAlign: "center",
  44. dataType: "String"
  45. },
  46. {
  47. headerName: "数量",
  48. headerWidth: 90,
  49. dataCode: "quantity",
  50. hAlign: "right",
  51. dataType: "Number",
  52. decimalField: 'glj.quantity'
  53. },
  54. {
  55. headerName: "风险系数%",
  56. headerWidth: 80,
  57. dataCode: "riskCoe",
  58. hAlign: "right",
  59. dataType: "Number",
  60. validator: "number"
  61. },
  62. {
  63. headerName: "基准单价",
  64. headerWidth: 70,
  65. dataCode: "standardPrice",
  66. hAlign: "right",
  67. dataType: "Number",
  68. validator: "number"
  69. },
  70. {
  71. headerName: "投标单价",
  72. headerWidth: 70,
  73. dataCode: "marketPrice",
  74. hAlign: "right",
  75. dataType: "Number",
  76. validator: "number"
  77. },
  78. {
  79. headerName: "合价",
  80. headerWidth: 90,
  81. dataCode: "totalPrice",
  82. hAlign: "right",
  83. dataType: "Number",
  84. validator: "number",
  85. decimalField: 'bills.totalPrice'
  86. },
  87. {
  88. headerName: "供货方式",
  89. headerWidth: 70,
  90. dataCode: "supply",
  91. hAlign: "center",
  92. dataType: "String",
  93. cellType: 'comboBox',
  94. editorValueType: true,
  95. options: supplyComboMap
  96. },
  97. {
  98. headerName: "备注",
  99. headerWidth: 100,
  100. dataCode: "remark",
  101. hAlign: "left",
  102. dataType: "String"
  103. }
  104. ],
  105. view: {
  106. lockColumns: ["is_related", "quantity", "totalPrice", "originPlace", "vender", "supply"]
  107. }
  108. },
  109. priceCoeSetting: {
  110. header: [{
  111. headerName: "关联",
  112. headerWidth: 80,
  113. dataCode: "is_related",
  114. dataType: "String",
  115. cellType: 'checkBox'
  116. },
  117. {
  118. headerName: "材料号",
  119. headerWidth: 80,
  120. dataCode: "code",
  121. dataType: "String"
  122. },
  123. {
  124. headerName: "材料名称",
  125. headerWidth: 160,
  126. dataCode: "name",
  127. dataType: "String",
  128. cellType: 'tipsCell'
  129. },
  130. {
  131. headerName: "规格型号",
  132. headerWidth: 120,
  133. dataCode: "specs",
  134. hAlign: "left",
  135. dataType: "String",
  136. cellType: 'tipsCell'
  137. },
  138. {
  139. headerName: "单位",
  140. headerWidth: 45,
  141. dataCode: "unit",
  142. hAlign: "center",
  143. dataType: "String"
  144. },
  145. {
  146. headerName: "变值权重B",
  147. headerWidth: 90,
  148. dataCode: "varWeight",
  149. hAlign: "right",
  150. dataType: "Number",
  151. validator: "number",
  152. formatter: "0.00"
  153. },
  154. {
  155. headerName: "基本价格指数F0",
  156. headerWidth: 70,
  157. dataCode: "FO",
  158. hAlign: "right",
  159. dataType: "Number",
  160. validator: "number"
  161. },
  162. {
  163. headerName: "现行价格指数Ft",
  164. headerWidth: 70,
  165. dataCode: "FI",
  166. hAlign: "right",
  167. dataType: "Number",
  168. validator: "number"
  169. },
  170. {
  171. headerName: "数量",
  172. headerWidth: 90,
  173. dataCode: "quantity",
  174. hAlign: "right",
  175. dataType: "Number",
  176. decimalField: 'glj.quantity'
  177. },
  178. {
  179. headerName: "单价",
  180. headerWidth: 70,
  181. dataCode: "marketPrice",
  182. hAlign: "right",
  183. dataType: "Number",
  184. validator: "number"
  185. },
  186. {
  187. headerName: "合价",
  188. headerWidth: 90,
  189. dataCode: "totalPrice",
  190. hAlign: "right",
  191. dataType: "Number",
  192. validator: "number",
  193. decimalField: 'bills.totalPrice'
  194. },
  195. {
  196. headerName: "供货方式",
  197. headerWidth: 70,
  198. dataCode: "supply",
  199. hAlign: "center",
  200. dataType: "String",
  201. cellType: 'comboBox',
  202. editorValueType: true,
  203. options: supplyComboMap
  204. },
  205. {
  206. headerName: "备注",
  207. headerWidth: 100,
  208. dataCode: "remark",
  209. hAlign: "left",
  210. dataType: "String"
  211. }
  212. ],
  213. view: {
  214. lockColumns: ["is_related", "quantity", "totalPrice", "originPlace", "varWeight", "vender", "supply"]
  215. }
  216. },
  217. refreshSheetDatas: function () {
  218. //读项目属性的值,若没有则默认为造价信息差额调整法
  219. let adjustType = $('#adjustType').val();
  220. if (adjustType === 'priceInfo') {
  221. materialAdjustObj.showPriceInfoDatas();
  222. } else {
  223. materialAdjustObj.showPriceCoeDatas();
  224. }
  225. configMaterialObj.showEvaluateRelateDatas();
  226. },
  227. getSheetDatas: function () {
  228. let adjustType = $('#adjustType').val();
  229. return adjustType === 'priceInfo' ? this.priceInfoDatas : this.priceCoeDatas;
  230. },
  231. getSheet: function () {
  232. let adjustType = $('#adjustType').val();
  233. return adjustType === 'priceInfo' ? this.priceInfoSheet : this.priceCoeSheet;
  234. },
  235. initPriceInfoSheet: function () {
  236. this.priceInfoSheet = configMaterialObj.configSpread.getSheet(2);
  237. sheetCommonObj.initSheet(this.priceInfoSheet, this.priceInfoSetting, 30);
  238. this.priceInfoSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSheetValueChange);
  239. this.priceInfoSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, this.onSelectionChange);
  240. this.priceInfoSheet.bind(GC.Spread.Sheets.Events.EditStarting, this.onPriceInfoEditString);
  241. this.priceInfoSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
  242. this.priceInfoSheet.name('priceInfoSheet');
  243. this.priceInfoSheet.setRowHeight(0, 36, 1);
  244. },
  245. initPriceCoeSheet: function () {
  246. this.priceCoeSheet = configMaterialObj.configSpread.getSheet(3);
  247. sheetCommonObj.initSheet(this.priceCoeSheet, this.priceCoeSetting, 30);
  248. this.priceCoeSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSheetValueChange);
  249. this.priceCoeSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, this.onSelectionChange);
  250. this.priceCoeSheet.bind(GC.Spread.Sheets.Events.EditStarting, this.onPriceInfoEditString);
  251. this.priceCoeSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
  252. this.priceCoeSheet.name('priceCoeSheet');
  253. this.priceCoeSheet.setRowHeight(0, 36, 1);
  254. },
  255. onSelectionChange: function (sender, args) {
  256. let me = configMaterialObj;
  257. let newSel = args.newSelections[0];
  258. let oldSel = args.oldSelections ? args.oldSelections[0] : {};
  259. if (newSel.row != oldSel.row) {
  260. me.showEvaluateRelateDatas();
  261. me.relateFilterAgain = false;
  262. }
  263. },
  264. onSheetRangeChange: function (a, args) {
  265. let me = materialAdjustObj,
  266. updateMap = {},
  267. tasks = [];
  268. let projectGLJ = projectObj.project.projectGLJ;
  269. let setting = $("#adjustType").val() == "priceInfo" ? me.priceInfoSetting : me.priceCoeSetting;
  270. let datas = $("#adjustType").val() == "priceInfo" ? me.priceInfoDatas : me.priceCoeDatas;
  271. for (let c of args.changedCells) {
  272. let dataCode = setting.header[c.col].dataCode;
  273. let value = args.sheet.getCell(c.row, c.col).text();
  274. let recode = datas[c.row];
  275. if (dataCode == "unit" && recode.is_related) {
  276. me.refreshSheetDatas();
  277. return;
  278. }
  279. if (value && !sheetCommonObj.checkData(c.col, setting, value)) {
  280. alert('输入的数据类型不对,请重新输入!');
  281. me.refreshSheetDatas();
  282. return;
  283. }
  284. if (dataCode == 'marketPrice') {
  285. dataCode = 'market_price';
  286. if (recode.is_related) { //关联的情况下,直接修改工料机价格
  287. return projectGLJ.updatePrice(recode, dataCode, value, 'rg', null, projectGljObject.refreshViewsData);
  288. }
  289. } else {
  290. let tem = updateMap[recode.ID] ? updateMap[recode.ID] : {};
  291. if (value && dataCode == "standardPrice") value = scMathUtil.roundForObj(value, getDecimal('glj.unitPrice')) + "";
  292. if (value == recode[dataCode]) continue;
  293. tem[dataCode] = value;
  294. updateMap[recode.ID] = tem;
  295. }
  296. }
  297. for (let ID in updateMap) {
  298. let edata = {
  299. type: "contractor_list",
  300. doc: updateMap[ID],
  301. action: "update",
  302. ID: ID
  303. };
  304. tasks.push(edata);
  305. }
  306. if (tasks.length > 0) configMaterialObj.updateEvaluateMaterial(tasks, false);
  307. },
  308. onPriceInfoEditString: function (a, args) {
  309. let me = materialAdjustObj;
  310. let setting = $("#adjustType").val() == "priceInfo" ? me.priceInfoSetting : me.priceCoeSetting;
  311. let datas = $("#adjustType").val() == "priceInfo" ? me.priceInfoDatas : me.priceCoeDatas;
  312. let dataCode = setting.header[args.col].dataCode;
  313. let recorde = datas[args.row];
  314. if (recorde) {
  315. if (recorde.is_related && dataCode == "unit") args.cancel = true;
  316. }
  317. },
  318. onSheetValueChange: function (a, args) {
  319. let me = materialAdjustObj,
  320. row = args.row,
  321. col = args.col;
  322. let setting = $("#adjustType").val() == "priceInfo" ? me.priceInfoSetting : me.priceCoeSetting;
  323. let datas = $("#adjustType").val() == "priceInfo" ? me.priceInfoDatas : me.priceCoeDatas;
  324. let dataCode = setting.header[col].dataCode;
  325. let evaluate = datas[row];
  326. let value = args.newValue;
  327. if (value && !sheetCommonObj.checkData(col, setting, value)) {
  328. alert('输入的数据类型不对,请重新输入!');
  329. return me.refreshSheetDatas();
  330. }
  331. if (dataCode == 'marketPrice') {
  332. dataCode = 'market_price';
  333. if (evaluate.is_evaluate == 1) {
  334. alert("当前材料市场价已被锁定,修改请先返回人材机汇总界面解除锁定。");
  335. return me.refreshSheetDatas();
  336. }
  337. if (evaluate.is_related) { //关联的情况下,直接修改工料机价格
  338. return projectObj.project.projectGLJ.updatePrice(evaluate, dataCode, value, 'rg', null, projectGljObject.refreshViewsData);
  339. }
  340. }
  341. if (dataCode == "standardPrice") value = scMathUtil.roundForObj(value, getDecimal('glj.unitPrice')) + "";
  342. let edata = {
  343. type: 'contractor_list',
  344. doc: {},
  345. action: "update",
  346. ID: evaluate.ID
  347. };
  348. if (evaluate[dataCode] == value) return me.refreshSheetDatas();
  349. edata.doc[dataCode] = value;
  350. configMaterialObj.updateEvaluateMaterial([edata], false);
  351. },
  352. deleteAdjust: function () {
  353. let me = this,
  354. updateMap = {};
  355. let projectGLJ = projectObj.project.projectGLJ;
  356. let datas = $("#adjustType").val() == "priceInfo" ? me.priceInfoDatas : me.priceCoeDatas;
  357. let sels = this.spread.getActiveSheet().getSelections();
  358. let select = sels.length > 0 ? sels[0] : null;
  359. if (!select) return;
  360. for (let i = 0; i < select.rowCount; i++) {
  361. let recode = datas[select.row + i];
  362. if (recode) updateMap[recode.id] = {
  363. is_info_adjust: 0,
  364. is_coe_adjust: 0
  365. };
  366. }
  367. if (_.isEmpty(updateMap)) return;
  368. projectGLJ.batchUpdateGLJProperty(updateMap, materialAdjustObj.refreshSheetDatas);
  369. },
  370. showPriceInfoDatas: function () {
  371. configMaterialObj.configSpread.setActiveSheetIndex(2);
  372. let sel = this.priceInfoSheet.getSelections()[0];
  373. let oldData = sel.row < this.priceInfoDatas.length ? this.priceInfoDatas[sel.row] : "";
  374. this.priceInfoDatas = this.getPirceInfoDatas();
  375. sheetCommonObj.showData(this.priceInfoSheet, this.priceInfoSetting, this.priceInfoDatas);
  376. this.priceInfoSheet.setRowCount(this.priceInfoDatas.length);
  377. sel.row = oldData ? _.findIndex(this.priceInfoDatas, {
  378. 'ID': oldData.ID
  379. }) : '';
  380. this.priceInfoSheet.setSelection(sel.row == -1 ? 0 : sel.row, sel.col, sel.rowCount, sel.colCount);
  381. },
  382. showPriceCoeDatas: function () {
  383. configMaterialObj.configSpread.setActiveSheetIndex(3);
  384. let sel = this.priceCoeSheet.getSelections()[0];
  385. let oldData = sel.row < this.priceCoeDatas.length ? this.priceCoeDatas[sel.row] : "";
  386. this.priceCoeDatas = this.getPriceCoeDatas();
  387. sheetCommonObj.showData(this.priceCoeSheet, this.priceCoeSetting, this.priceCoeDatas);
  388. this.priceCoeSheet.setRowCount(this.priceCoeDatas.length);
  389. sel.row = oldData ? _.findIndex(this.priceCoeDatas, {
  390. 'ID': oldData.ID
  391. }) : '';
  392. this.priceCoeSheet.setSelection(sel.row == -1 ? 0 : sel.row, sel.col, sel.rowCount, sel.colCount);
  393. },
  394. getPirceInfoDatas: function (projectGLJList, contractor_list, decimalObj) {
  395. let datas = [];
  396. let pgljList = projectGLJList ? projectGLJList : projectObj.project.projectGLJ.datas.gljList;
  397. let contractorList = contractor_list ? contractor_list : projectObj.project.contractor_list.datas;
  398. let billsDecimal = decimalObj ? decimalObj.bills.totalPrice : getDecimal('bills.totalPrice');
  399. let gljMap = _.indexBy(pgljList, 'id');
  400. for (let e of contractorList) {
  401. let t = {
  402. ID: e.ID,
  403. projectID: e.projectID,
  404. is_related: e.is_related, //关联,1关,0不关
  405. projectGLJID: e.projectGLJID, //关联工料机ID
  406. seq: e.seq, //序号
  407. code: e.code,
  408. name: e.name,
  409. specs: e.specs,
  410. unit: e.unit,
  411. type: e.type,
  412. marketPrice: e.market_price,
  413. quantity: e.quantity,
  414. remark: e.remark,
  415. supply: e.supply,
  416. riskCoe: e.riskCoe,
  417. is_evaluate: 0,
  418. standardPrice: e.standardPrice
  419. };
  420. let pglj = gljMap[e.projectGLJID];
  421. if (e.is_related && pglj) {
  422. gljOprObj.setGLJPrice(t, pglj);
  423. t.vender = pglj.vender;
  424. t.supply = pglj.supply;
  425. t.is_evaluate = pglj.is_evaluate;
  426. t.quantity = pglj.quantity;
  427. }
  428. t.totalPrice = scMathUtil.roundForObj(parseFloat(t.quantity) * parseFloat(t.marketPrice), billsDecimal);
  429. datas.push(t);
  430. }
  431. return _.sortByAll(datas, 'code');
  432. },
  433. getPriceCoeDatas: function (projectGLJList, contractor_list, totalFee, decimalObj) {
  434. let datas = [];
  435. let pgljList = projectGLJList ? projectGLJList : projectObj.project.projectGLJ.datas.gljList;
  436. let contractorList = contractor_list ? contractor_list : projectObj.project.contractor_list.datas;
  437. let billsDecimal = decimalObj ? decimalObj.bills.totalPrice : getDecimal('bills.totalPrice');
  438. let gljMap = _.indexBy(pgljList, 'id');
  439. if (!gljUtil.isDef(totalFee)) {
  440. let node = projectObj.project.Bills.getEngineeringCostNode(projectObj.mainController);
  441. totalFee = node && node.data.feesIndex && node.data.feesIndex.common ? node.data.feesIndex.common.totalFee : 0;
  442. }
  443. for (let e of contractorList) {
  444. let t = {
  445. ID: e.ID,
  446. projectID: e.projectID,
  447. is_related: e.is_related, //关联,1关,0不关
  448. projectGLJID: e.projectGLJID, //关联工料机ID
  449. seq: e.seq, //序号
  450. code: e.code,
  451. name: e.name,
  452. specs: e.specs,
  453. unit: e.unit,
  454. type: e.type,
  455. marketPrice: e.market_price,
  456. quantity: e.quantity,
  457. remark: e.remark,
  458. supply: e.supply,
  459. is_evaluate: 0,
  460. FO: e.FO,
  461. FI: e.FI
  462. };
  463. let pglj = gljMap[e.projectGLJID];
  464. if (e.is_related && pglj) {
  465. gljOprObj.setGLJPrice(t, pglj);
  466. t.vender = pglj.vender;
  467. t.supply = pglj.supply;
  468. t.quantity = pglj.quantity;
  469. t.is_evaluate = pglj.is_evaluate;
  470. }
  471. t.totalPrice = scMathUtil.roundForObj(parseFloat(t.quantity) * parseFloat(t.marketPrice), billsDecimal);
  472. if (totalFee !== 0) t.varWeight = scMathUtil.roundForObj(t.totalPrice / totalFee, 2);
  473. datas.push(t);
  474. }
  475. return _.sortByAll(datas, 'code');
  476. },
  477. getCommonObject: function (glj) {
  478. let data = {
  479. select: 0,
  480. id: glj.id,
  481. code: glj.code,
  482. name: glj.name,
  483. specs: glj.specs,
  484. unit: glj.unit,
  485. type: glj.type,
  486. quantity: glj.quantity,
  487. supply: glj.supply,
  488. originPlace: glj.originPlace,
  489. vender: glj.vender,
  490. brand: glj.brand,
  491. remark: glj.remark
  492. };
  493. gljOprObj.setGLJPrice(data, glj);
  494. return data;
  495. },
  496. checkedDefualtOption: function (className) {
  497. for (let a of $("." + className)) {
  498. if (className == "pglj_sel_input" || a.id == "glj_sel_material" || a.id == "glj_sel_main" || a.id == "glj_sel_eqp") $(a).prop("checked", true)
  499. }
  500. },
  501. insertEmptyRow: function () {
  502. let ndata = {
  503. type: "contractor_list",
  504. doc: {},
  505. action: "add"
  506. };
  507. ndata.doc['ID'] = uuid.v1();
  508. ndata.doc['is_related'] = 0;
  509. ndata.doc['seq'] = "";
  510. ndata.doc['projectID'] = projectObj.project.ID();
  511. ndata.doc['code'] = "";
  512. ndata.doc['name'] = "";
  513. ndata.doc['unit'] = "";
  514. ndata.doc['originPlace'] = "";
  515. ndata.doc['vender'] = "";
  516. ndata.doc['remark'] = "";
  517. ndata.doc['supply'] = "";
  518. ndata.doc['riskCoe'] = "";
  519. ndata.doc['standardPrice'] = "";
  520. ndata.doc['FO'] = "";
  521. ndata.doc['FI'] = "";
  522. configMaterialObj.updateEvaluateMaterial([ndata], false);
  523. }
  524. };
  525. let gljFromObj = {
  526. spread: null,
  527. sheet: null,
  528. datas: [],
  529. setting: {
  530. header: [{
  531. headerName: "选择",
  532. headerWidth: 45,
  533. dataCode: "select",
  534. hAlign: "center",
  535. dataType: "String",
  536. cellType: 'checkBox'
  537. },
  538. {
  539. headerName: "编码",
  540. headerWidth: 80,
  541. dataCode: "code",
  542. dataType: "String"
  543. },
  544. {
  545. headerName: "类型",
  546. headerWidth: 30,
  547. dataCode: "short_name",
  548. hAlign: "center",
  549. dataType: "String"
  550. },
  551. {
  552. headerName: "名称",
  553. headerWidth: 160,
  554. dataCode: "name",
  555. dataType: "String",
  556. cellType: 'tipsCell'
  557. },
  558. {
  559. headerName: "规格型号",
  560. headerWidth: 100,
  561. dataCode: "specs",
  562. hAlign: "left",
  563. dataType: "String",
  564. cellType: 'tipsCell'
  565. },
  566. {
  567. headerName: "单位",
  568. headerWidth: 45,
  569. dataCode: "unit",
  570. hAlign: "center",
  571. dataType: "String"
  572. },
  573. {
  574. headerName: "总消耗量",
  575. headerWidth: 90,
  576. dataCode: "quantity",
  577. hAlign: "right",
  578. dataType: "Number",
  579. decimalField: 'glj.quantity'
  580. },
  581. {
  582. headerName: "市场价",
  583. headerWidth: 70,
  584. dataCode: "marketPrice",
  585. hAlign: "right",
  586. dataType: "Number",
  587. validator: "number"
  588. }, //,decimalField:"glj.unitPrice"
  589. {
  590. headerName: "供货方式",
  591. headerWidth: 70,
  592. dataCode: "supply",
  593. hAlign: "center",
  594. dataType: "String",
  595. cellType: 'comboBox',
  596. editorValueType: true,
  597. options: supplyComboMap
  598. },
  599. {
  600. headerName: "暂估",
  601. headerWidth: 45,
  602. dataCode: "is_evaluate",
  603. hAlign: "center",
  604. dataType: "String",
  605. cellType: 'checkBox'
  606. },
  607. {
  608. headerName: "产地",
  609. headerWidth: 80,
  610. dataCode: "originPlace",
  611. hAlign: "left",
  612. dataType: "String"
  613. },
  614. {
  615. headerName: "厂家",
  616. headerWidth: 80,
  617. dataCode: "vender",
  618. hAlign: "left",
  619. dataType: "String"
  620. },
  621. {
  622. headerName: "备注",
  623. headerWidth: 100,
  624. dataCode: "remark",
  625. hAlign: "left",
  626. dataType: "String"
  627. }
  628. ],
  629. view: {
  630. lockColumns: ["is_evaluate"]
  631. }
  632. },
  633. checkType: "取消", //记住点击过的按钮的text
  634. initSpread: function () {
  635. if (!this.spread) {
  636. this.spread = SheetDataHelper.createNewSpread($("#glj_from_sheet")[0]);
  637. sheetCommonObj.spreadDefaultStyle(this.spread);
  638. } else {
  639. this.spread.refresh();
  640. }
  641. this.sheet = this.spread.getSheet(0);
  642. sheetCommonObj.initSheet(this.sheet, this.setting);
  643. this.sheet.bind(GC.Spread.Sheets.Events.EditStarting, this.onEditStarting);
  644. this.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, this.onClipboardPasting);
  645. this.sheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onValueChanged);
  646. this.sheet.setRowHeight(0, 36, 1);
  647. disableRightMenu("glj_from_sheet", this.spread);
  648. },
  649. onEditStarting: function (e, args) {
  650. args.cancel = true;
  651. },
  652. onClipboardPasting: function (e, args) {
  653. args.cancel = true;
  654. },
  655. onValueChanged: function (e, args) {
  656. let me = gljFromObj;
  657. let value = args.newValue;
  658. value = value == true ? 1 : 0;
  659. me.datas[args.row].select = value;
  660. },
  661. showDatas: function () {
  662. this.datas = [];
  663. let gljList = projectObj.project.projectGLJ.datas.gljList;
  664. gljList = this.filterGLJ(gljList);
  665. gljList = sortProjectGLJ(gljList);
  666. for (let glj of gljList) {
  667. this.datas.push(this.getSheetDatas(glj));
  668. }
  669. this.refreshDatas();
  670. },
  671. filterGLJ: function (gljList) {
  672. let typeMap = {};
  673. for (let ch of $(".glj_sel_input:checked")) {
  674. typeMap[$(ch).val()] = true;
  675. }
  676. let inputV = $("#glj_sel_input").val();
  677. return _.filter(gljList, function (item) {
  678. if (item.quantity === 0 || item.quantity === '0') return false;
  679. if (!typeMap[0]) { //如果没有勾选所有,下面再细分
  680. let firstS = (item.type + "").substring(0, 1);
  681. if (!typeMap[firstS]) return false
  682. }
  683. if (inputV != "") { //输入的关键字过滤
  684. if (item.code.indexOf(inputV) == -1 && item.name.indexOf(inputV) == -1) return false
  685. }
  686. return true;
  687. });
  688. },
  689. refreshDatas: function () {
  690. this.checkByType(this.checkType);
  691. sheetCommonObj.showData(this.sheet, this.setting, this.datas);
  692. this.sheet.setRowCount(this.datas.length);
  693. },
  694. getSheetDatas(glj) {
  695. let projectGLJ = projectObj.project.projectGLJ;
  696. let materialIdList = projectGLJ.datas.constData.materialIdList;
  697. let data = materialAdjustObj.getCommonObject(glj);
  698. data.select = 0;
  699. data.short_name = projectGLJ.getShortNameByID(glj.type);
  700. // 只有材料才显示是否暂估
  701. if (materialIdList.indexOf(glj.type) >= 0) data.is_evaluate = glj.is_evaluate;
  702. data.from = glj;
  703. data.is_contractor_material = glj.is_contractor_material;
  704. return data;
  705. },
  706. checkByType: function (type) {
  707. for (let d of this.datas) {
  708. d.select = 0;
  709. switch (type) {
  710. case "全选":
  711. d.select = 1;
  712. break;
  713. case "全选主材":
  714. if (d.type == 4) d.select = 1;
  715. break;
  716. case "全选设备":
  717. if (d.type == 5) d.select = 1;
  718. break;
  719. case "取消":
  720. d.select = d.is_contractor_material ? 1 : 0;
  721. break;
  722. }
  723. }
  724. },
  725. confirmSelect: function () {
  726. let tasks = [];
  727. let datas = projectObj.project.contractor_list.datas,
  728. modelType = 'contractor_list',
  729. field = 'is_contractor_material';
  730. let evaluateMap = _.indexBy(datas, "projectGLJID");
  731. let evaluateKeyMap = {}; //关键字映射表
  732. for (let e of datas) {
  733. let eIndex = gljUtil.getIndex(e, gljUtil.materialKeyArray);
  734. evaluateKeyMap[eIndex] = e;
  735. }
  736. for (let d of this.datas) {
  737. if (d.select == 1) { //如果是选中状态
  738. if (d[field] == 1) { //如果已经标记为承包人材料
  739. let evl = evaluateMap[d.id];
  740. if (evl) {
  741. //这里应该是错误检查的保证,按正常是不应该出现这种情况的
  742. if (evl.is_related != 1) tasks.push({
  743. type: modelType,
  744. doc: {
  745. projectGLJID: d.id,
  746. is_related: 1
  747. },
  748. action: "update",
  749. ID: evl.ID
  750. });
  751. } else {
  752. tasks.push(getNewEval(d, modelType))
  753. }
  754. } else { //如果不是暂估,要改成暂估
  755. let pdata = {
  756. id: d.id,
  757. doc: {},
  758. action: 'update',
  759. type: "glj_list"
  760. };
  761. pdata.doc[field] = 1;
  762. tasks.push(pdata);
  763. let evaluate = evaluateKeyMap[gljUtil.getIndex(d, gljUtil.materialKeyArray)];
  764. if (evaluate) { //如果已经存在5个关键字相同的暂估材料,则自动关联起来
  765. let edata = {
  766. type: modelType,
  767. doc: {
  768. projectGLJID: d.id,
  769. is_related: 1
  770. },
  771. action: "update",
  772. ID: evaluate.ID
  773. };
  774. tasks.push(edata);
  775. } else { //如果不存在,则生成一条新的
  776. tasks.push(getNewEval(d, modelType));
  777. }
  778. }
  779. } else { //未选中状态的,检查一下是否存在关联的情况,取消关联
  780. let tdoc = {};
  781. tdoc[field] = 0;
  782. if (d[field] == 1) tasks.push({
  783. id: d.id,
  784. doc: tdoc,
  785. action: 'update',
  786. type: "glj_list"
  787. });
  788. let evl = evaluateMap[d.id];
  789. if (evl) {
  790. if (evl.is_related == 1) tasks.push({
  791. type: modelType,
  792. doc: {
  793. is_related: 0
  794. },
  795. action: "update",
  796. ID: evl.ID
  797. });
  798. }
  799. let evaluate = evaluateKeyMap[gljUtil.getIndex(d, gljUtil.materialKeyArray)];
  800. if (evaluate) {
  801. if (evaluate.is_related == 1) tasks.push({
  802. type: modelType,
  803. doc: {
  804. is_related: 0
  805. },
  806. action: "update",
  807. ID: evaluate.ID
  808. });
  809. }
  810. }
  811. }
  812. if (tasks.length > 0) configMaterialObj.updateEvaluateMaterial(tasks);
  813. function getNewEval(d, m_t) {
  814. let ndata = {
  815. type: m_t,
  816. doc: {},
  817. action: "add"
  818. };
  819. ndata.doc['ID'] = uuid.v1();
  820. ndata.doc['projectGLJID'] = d.id;
  821. ndata.doc['is_related'] = 1;
  822. ndata.doc['seq'] = d.code;
  823. ndata.doc['projectID'] = d.from.project_id;
  824. ndata.doc['code'] = d.code;
  825. ndata.doc['name'] = d.name;
  826. ndata.doc['specs'] = d.specs;
  827. ndata.doc['unit'] = d.unit;
  828. ndata.doc['quantity'] = d.quantity;
  829. ndata.doc['type'] = d.type;
  830. ndata.doc['market_price'] = d.from.unit_price.market_price;
  831. ndata.doc['originPlace'] = d.originPlace;
  832. ndata.doc['vender'] = d.vender;
  833. ndata.doc['remark'] = d.remark;
  834. ndata.doc['supply'] = d.supply;
  835. ndata.doc['riskCoe'] = "";
  836. ndata.doc['standardPrice'] = d.from.unit_price.market_price;
  837. ndata.doc['FO'] = "";
  838. ndata.doc['FI'] = "";
  839. return ndata;
  840. }
  841. }
  842. };
  843. $(function () {
  844. $("#adjustType").change(function () {
  845. materialAdjustObj.refreshSheetDatas();
  846. let val = $(this).val();
  847. let mixDatas = {
  848. projectID: projectObj.project.projectInfo.ID,
  849. updateType: 'update',
  850. properties: {
  851. 'property.gljAdjustType': val
  852. },
  853. options: {},
  854. labourCoes: {},
  855. rations: [],
  856. bills: []
  857. };
  858. CommonAjax.post('/pm/api/updateMixDatas', {
  859. user_id: userID,
  860. mixDataArr: mixDatas
  861. }, function (rstData) {
  862. projectObj.project.projectInfo.property.gljAdjustType = val;
  863. });
  864. });
  865. $('#selectFromGLJ').on('shown.bs.modal', function (e) {
  866. gljFromObj.checkType = "取消";
  867. gljFromObj.initSpread();
  868. gljFromObj.showDatas();
  869. });
  870. $(".glj_sel_input").change(function () {
  871. let check = $(this).prop("checked");
  872. if ($(this).val() == 0) { //勾选的是全选,其它的勾选项跟着改变
  873. for (let a of $(".glj_sel_input")) {
  874. $(a).prop("checked", check)
  875. }
  876. } else { //勾选其它选项
  877. let a_checked = true;
  878. for (let o of $(".glj_sel_input_other")) { //如果其它的有一个不勾选,则所有项也不打勾
  879. if ($(o).prop("checked") === false) {
  880. a_checked = false;
  881. break;
  882. }
  883. }
  884. $("#glj_sel_all").prop("checked", a_checked);
  885. }
  886. gljFromObj.showDatas();
  887. });
  888. $("#glj_sel_btn_find").click(function () {
  889. gljFromObj.showDatas();
  890. });
  891. $(".glj_sel_check_btn").click(function () {
  892. gljFromObj.checkType = $(this).text();
  893. gljFromObj.refreshDatas();
  894. })
  895. $("#glj_sel_confirm").click(function () {
  896. gljFromObj.confirmSelect();
  897. })
  898. });