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, projectProperty) {
  434. let pgljList = projectGLJList ? projectGLJList : projectObj.project.projectGLJ.datas.gljList;
  435. let contractorList = contractor_list ? contractor_list : projectObj.project.contractor_list.datas;
  436. let tprojectProperty = projectProperty?projectProperty:projectObj.project.projectInfo.property;
  437. if (!gljUtil.isDef(totalFee)) {
  438. let node = projectObj.project.Bills.getEngineeringCostNode(projectObj.mainController);
  439. totalFee = node && node.data.feesIndex && node.data.feesIndex.common ? node.data.feesIndex.common.totalFee : 0;
  440. }
  441. return gljUtil.getPriceCoeDatas(pgljList, contractorList, totalFee, tprojectProperty,_,scMathUtil)
  442. /* for (let e of contractorList) {
  443. let t = {
  444. ID: e.ID,
  445. projectID: e.projectID,
  446. is_related: e.is_related, //关联,1关,0不关
  447. projectGLJID: e.projectGLJID, //关联工料机ID
  448. seq: e.seq, //序号
  449. code: e.code,
  450. name: e.name,
  451. specs: e.specs,
  452. unit: e.unit,
  453. type: e.type,
  454. marketPrice: e.market_price,
  455. quantity: e.quantity,
  456. remark: e.remark,
  457. supply: e.supply,
  458. is_evaluate: 0,
  459. FO: e.FO,
  460. FI: e.FI
  461. };
  462. let pglj = gljMap[e.projectGLJID];
  463. if (e.is_related && pglj) {
  464. gljOprObj.setGLJPrice(t, pglj);
  465. t.vender = pglj.vender;
  466. t.supply = pglj.supply;
  467. t.quantity = pglj.quantity;
  468. t.is_evaluate = pglj.is_evaluate;
  469. }
  470. t.totalPrice = scMathUtil.roundForObj(parseFloat(t.quantity) * parseFloat(t.marketPrice), billsDecimal);
  471. if (totalFee !== 0) t.varWeight = scMathUtil.roundForObj(t.totalPrice / totalFee, 2);
  472. datas.push(t);
  473. }
  474. return _.sortByAll(datas, 'code'); */
  475. },
  476. getCommonObject: function (glj) {
  477. let data = {
  478. select: 0,
  479. id: glj.id,
  480. code: glj.code,
  481. name: glj.name,
  482. specs: glj.specs,
  483. unit: glj.unit,
  484. type: glj.type,
  485. quantity: glj.quantity,
  486. supply: glj.supply,
  487. originPlace: glj.originPlace,
  488. vender: glj.vender,
  489. brand: glj.brand,
  490. remark: glj.remark
  491. };
  492. gljOprObj.setGLJPrice(data, glj);
  493. return data;
  494. },
  495. checkedDefualtOption: function (className) {
  496. for (let a of $("." + className)) {
  497. if (className == "pglj_sel_input" || a.id == "glj_sel_material" || a.id == "glj_sel_main" || a.id == "glj_sel_eqp") $(a).prop("checked", true)
  498. }
  499. },
  500. insertEmptyRow: function () {
  501. let ndata = {
  502. type: "contractor_list",
  503. doc: {},
  504. action: "add"
  505. };
  506. ndata.doc['ID'] = uuid.v1();
  507. ndata.doc['is_related'] = 0;
  508. ndata.doc['seq'] = "";
  509. ndata.doc['projectID'] = projectObj.project.ID();
  510. ndata.doc['code'] = "";
  511. ndata.doc['name'] = "";
  512. ndata.doc['unit'] = "";
  513. ndata.doc['originPlace'] = "";
  514. ndata.doc['vender'] = "";
  515. ndata.doc['remark'] = "";
  516. ndata.doc['supply'] = "";
  517. ndata.doc['riskCoe'] = "";
  518. ndata.doc['standardPrice'] = "";
  519. ndata.doc['FO'] = "";
  520. ndata.doc['FI'] = "";
  521. configMaterialObj.updateEvaluateMaterial([ndata], false);
  522. }
  523. };
  524. let gljFromObj = {
  525. spread: null,
  526. sheet: null,
  527. datas: [],
  528. setting: {
  529. header: [{
  530. headerName: "选择",
  531. headerWidth: 45,
  532. dataCode: "select",
  533. hAlign: "center",
  534. dataType: "String",
  535. cellType: 'checkBox'
  536. },
  537. {
  538. headerName: "编码",
  539. headerWidth: 80,
  540. dataCode: "code",
  541. dataType: "String"
  542. },
  543. {
  544. headerName: "类型",
  545. headerWidth: 30,
  546. dataCode: "short_name",
  547. hAlign: "center",
  548. dataType: "String"
  549. },
  550. {
  551. headerName: "名称",
  552. headerWidth: 160,
  553. dataCode: "name",
  554. dataType: "String",
  555. cellType: 'tipsCell'
  556. },
  557. {
  558. headerName: "规格型号",
  559. headerWidth: 100,
  560. dataCode: "specs",
  561. hAlign: "left",
  562. dataType: "String",
  563. cellType: 'tipsCell'
  564. },
  565. {
  566. headerName: "单位",
  567. headerWidth: 45,
  568. dataCode: "unit",
  569. hAlign: "center",
  570. dataType: "String"
  571. },
  572. {
  573. headerName: "总消耗量",
  574. headerWidth: 90,
  575. dataCode: "quantity",
  576. hAlign: "right",
  577. dataType: "Number",
  578. decimalField: 'glj.quantity'
  579. },
  580. {
  581. headerName: "市场价",
  582. headerWidth: 70,
  583. dataCode: "marketPrice",
  584. hAlign: "right",
  585. dataType: "Number",
  586. validator: "number"
  587. }, //,decimalField:"glj.unitPrice"
  588. {
  589. headerName: "供货方式",
  590. headerWidth: 70,
  591. dataCode: "supply",
  592. hAlign: "center",
  593. dataType: "String",
  594. cellType: 'comboBox',
  595. editorValueType: true,
  596. options: supplyComboMap
  597. },
  598. {
  599. headerName: "暂估",
  600. headerWidth: 45,
  601. dataCode: "is_evaluate",
  602. hAlign: "center",
  603. dataType: "String",
  604. cellType: 'checkBox'
  605. },
  606. {
  607. headerName: "产地",
  608. headerWidth: 80,
  609. dataCode: "originPlace",
  610. hAlign: "left",
  611. dataType: "String"
  612. },
  613. {
  614. headerName: "厂家",
  615. headerWidth: 80,
  616. dataCode: "vender",
  617. hAlign: "left",
  618. dataType: "String"
  619. },
  620. {
  621. headerName: "备注",
  622. headerWidth: 100,
  623. dataCode: "remark",
  624. hAlign: "left",
  625. dataType: "String"
  626. }
  627. ],
  628. view: {
  629. lockColumns: ["is_evaluate"]
  630. }
  631. },
  632. checkType: "取消", //记住点击过的按钮的text
  633. initSpread: function () {
  634. if (!this.spread) {
  635. this.spread = SheetDataHelper.createNewSpread($("#glj_from_sheet")[0]);
  636. sheetCommonObj.spreadDefaultStyle(this.spread);
  637. } else {
  638. this.spread.refresh();
  639. }
  640. this.sheet = this.spread.getSheet(0);
  641. sheetCommonObj.initSheet(this.sheet, this.setting);
  642. this.sheet.bind(GC.Spread.Sheets.Events.EditStarting, this.onEditStarting);
  643. this.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, this.onClipboardPasting);
  644. this.sheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onValueChanged);
  645. this.sheet.setRowHeight(0, 36, 1);
  646. disableRightMenu("glj_from_sheet", this.spread);
  647. },
  648. onEditStarting: function (e, args) {
  649. args.cancel = true;
  650. },
  651. onClipboardPasting: function (e, args) {
  652. args.cancel = true;
  653. },
  654. onValueChanged: function (e, args) {
  655. let me = gljFromObj;
  656. let value = args.newValue;
  657. value = value == true ? 1 : 0;
  658. me.datas[args.row].select = value;
  659. },
  660. showDatas: function () {
  661. this.datas = [];
  662. let gljList = projectObj.project.projectGLJ.datas.gljList;
  663. gljList = this.filterGLJ(gljList);
  664. gljList = sortProjectGLJ(gljList);
  665. for (let glj of gljList) {
  666. this.datas.push(this.getSheetDatas(glj));
  667. }
  668. this.refreshDatas();
  669. },
  670. filterGLJ: function (gljList) {
  671. let typeMap = {};
  672. for (let ch of $(".glj_sel_input:checked")) {
  673. typeMap[$(ch).val()] = true;
  674. }
  675. let inputV = $("#glj_sel_input").val();
  676. return _.filter(gljList, function (item) {
  677. if (item.quantity === 0 || item.quantity === '0') return false;
  678. if (!typeMap[0]) { //如果没有勾选所有,下面再细分
  679. let firstS = (item.type + "").substring(0, 1);
  680. if (!typeMap[firstS]) return false
  681. }
  682. if (inputV != "") { //输入的关键字过滤
  683. if (item.code.indexOf(inputV) == -1 && item.name.indexOf(inputV) == -1) return false
  684. }
  685. return true;
  686. });
  687. },
  688. refreshDatas: function () {
  689. this.checkByType(this.checkType);
  690. sheetCommonObj.showData(this.sheet, this.setting, this.datas);
  691. this.sheet.setRowCount(this.datas.length);
  692. },
  693. getSheetDatas(glj) {
  694. let projectGLJ = projectObj.project.projectGLJ;
  695. let materialIdList = projectGLJ.datas.constData.materialIdList;
  696. let data = materialAdjustObj.getCommonObject(glj);
  697. data.select = 0;
  698. data.short_name = projectGLJ.getShortNameByID(glj.type);
  699. // 只有材料才显示是否暂估
  700. if (materialIdList.indexOf(glj.type) >= 0) data.is_evaluate = glj.is_evaluate;
  701. data.from = glj;
  702. data.is_contractor_material = glj.is_contractor_material;
  703. return data;
  704. },
  705. checkByType: function (type) {
  706. for (let d of this.datas) {
  707. d.select = 0;
  708. switch (type) {
  709. case "全选":
  710. d.select = 1;
  711. break;
  712. case "全选主材":
  713. if (d.type == 4) d.select = 1;
  714. break;
  715. case "全选设备":
  716. if (d.type == 5) d.select = 1;
  717. break;
  718. case "取消":
  719. d.select = d.is_contractor_material ? 1 : 0;
  720. break;
  721. }
  722. }
  723. },
  724. confirmSelect: function () {
  725. let tasks = [];
  726. let datas = projectObj.project.contractor_list.datas,
  727. modelType = 'contractor_list',
  728. field = 'is_contractor_material';
  729. let evaluateMap = _.indexBy(datas, "projectGLJID");
  730. let evaluateKeyMap = {}; //关键字映射表
  731. for (let e of datas) {
  732. let eIndex = gljUtil.getIndex(e, gljUtil.materialKeyArray);
  733. evaluateKeyMap[eIndex] = e;
  734. }
  735. for (let d of this.datas) {
  736. if (d.select == 1) { //如果是选中状态
  737. if (d[field] == 1) { //如果已经标记为承包人材料
  738. let evl = evaluateMap[d.id];
  739. if (evl) {
  740. //这里应该是错误检查的保证,按正常是不应该出现这种情况的
  741. if (evl.is_related != 1) tasks.push({
  742. type: modelType,
  743. doc: {
  744. projectGLJID: d.id,
  745. is_related: 1
  746. },
  747. action: "update",
  748. ID: evl.ID
  749. });
  750. } else {
  751. tasks.push(getNewEval(d, modelType))
  752. }
  753. } else { //如果不是暂估,要改成暂估
  754. let pdata = {
  755. id: d.id,
  756. doc: {},
  757. action: 'update',
  758. type: "glj_list"
  759. };
  760. pdata.doc[field] = 1;
  761. tasks.push(pdata);
  762. let evaluate = evaluateKeyMap[gljUtil.getIndex(d, gljUtil.materialKeyArray)];
  763. if (evaluate) { //如果已经存在5个关键字相同的暂估材料,则自动关联起来
  764. let edata = {
  765. type: modelType,
  766. doc: {
  767. projectGLJID: d.id,
  768. is_related: 1
  769. },
  770. action: "update",
  771. ID: evaluate.ID
  772. };
  773. tasks.push(edata);
  774. } else { //如果不存在,则生成一条新的
  775. tasks.push(getNewEval(d, modelType));
  776. }
  777. }
  778. } else { //未选中状态的,检查一下是否存在关联的情况,取消关联
  779. let tdoc = {};
  780. tdoc[field] = 0;
  781. if (d[field] == 1) tasks.push({
  782. id: d.id,
  783. doc: tdoc,
  784. action: 'update',
  785. type: "glj_list"
  786. });
  787. let evl = evaluateMap[d.id];
  788. if (evl) {
  789. if (evl.is_related == 1) tasks.push({
  790. type: modelType,
  791. doc: {
  792. is_related: 0
  793. },
  794. action: "update",
  795. ID: evl.ID
  796. });
  797. }
  798. let evaluate = evaluateKeyMap[gljUtil.getIndex(d, gljUtil.materialKeyArray)];
  799. if (evaluate) {
  800. if (evaluate.is_related == 1) tasks.push({
  801. type: modelType,
  802. doc: {
  803. is_related: 0
  804. },
  805. action: "update",
  806. ID: evaluate.ID
  807. });
  808. }
  809. }
  810. }
  811. if (tasks.length > 0) configMaterialObj.updateEvaluateMaterial(tasks);
  812. function getNewEval(d, m_t) {
  813. let ndata = {
  814. type: m_t,
  815. doc: {},
  816. action: "add"
  817. };
  818. ndata.doc['ID'] = uuid.v1();
  819. ndata.doc['projectGLJID'] = d.id;
  820. ndata.doc['is_related'] = 1;
  821. ndata.doc['seq'] = d.code;
  822. ndata.doc['projectID'] = d.from.project_id;
  823. ndata.doc['code'] = d.code;
  824. ndata.doc['name'] = d.name;
  825. ndata.doc['specs'] = d.specs;
  826. ndata.doc['unit'] = d.unit;
  827. ndata.doc['quantity'] = d.quantity;
  828. ndata.doc['type'] = d.type;
  829. ndata.doc['market_price'] = d.from.unit_price.market_price;
  830. ndata.doc['originPlace'] = d.originPlace;
  831. ndata.doc['vender'] = d.vender;
  832. ndata.doc['remark'] = d.remark;
  833. ndata.doc['supply'] = d.supply;
  834. ndata.doc['riskCoe'] = "";
  835. ndata.doc['standardPrice'] = d.from.unit_price.market_price;
  836. ndata.doc['FO'] = "";
  837. ndata.doc['FI'] = "";
  838. return ndata;
  839. }
  840. }
  841. };
  842. $(function () {
  843. $("#adjustType").change(function () {
  844. materialAdjustObj.refreshSheetDatas();
  845. let val = $(this).val();
  846. let mixDatas = {
  847. projectID: projectObj.project.projectInfo.ID,
  848. updateType: 'update',
  849. properties: {
  850. 'property.gljAdjustType': val
  851. },
  852. options: {},
  853. labourCoes: {},
  854. rations: [],
  855. bills: []
  856. };
  857. CommonAjax.post('/pm/api/updateMixDatas', {
  858. user_id: userID,
  859. mixDataArr: mixDatas
  860. }, function (rstData) {
  861. projectObj.project.projectInfo.property.gljAdjustType = val;
  862. });
  863. });
  864. $('#selectFromGLJ').on('shown.bs.modal', function (e) {
  865. gljFromObj.checkType = "取消";
  866. gljFromObj.initSpread();
  867. gljFromObj.showDatas();
  868. });
  869. $(".glj_sel_input").change(function () {
  870. let check = $(this).prop("checked");
  871. if ($(this).val() == 0) { //勾选的是全选,其它的勾选项跟着改变
  872. for (let a of $(".glj_sel_input")) {
  873. $(a).prop("checked", check)
  874. }
  875. } else { //勾选其它选项
  876. let a_checked = true;
  877. for (let o of $(".glj_sel_input_other")) { //如果其它的有一个不勾选,则所有项也不打勾
  878. if ($(o).prop("checked") === false) {
  879. a_checked = false;
  880. break;
  881. }
  882. }
  883. $("#glj_sel_all").prop("checked", a_checked);
  884. }
  885. gljFromObj.showDatas();
  886. });
  887. $("#glj_sel_btn_find").click(function () {
  888. gljFromObj.showDatas();
  889. });
  890. $(".glj_sel_check_btn").click(function () {
  891. gljFromObj.checkType = $(this).text();
  892. gljFromObj.refreshDatas();
  893. })
  894. $("#glj_sel_confirm").click(function () {
  895. gljFromObj.confirmSelect();
  896. })
  897. });