config_material_view.js 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551
  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: "关联",
  14. headerWidth: 80,
  15. dataCode: "is_related",
  16. dataType: "String",
  17. cellType: 'checkBox'
  18. },
  19. {
  20. headerName: "序号",
  21. headerWidth: 80,
  22. dataCode: "seq",
  23. dataType: "String",
  24. formatter: "@"
  25. },
  26. {
  27. headerName: "材料号",
  28. headerWidth: 80,
  29. dataCode: "code",
  30. dataType: "String",
  31. formatter: "@"
  32. },
  33. {
  34. headerName: "材料名称",
  35. headerWidth: 160,
  36. dataCode: "name",
  37. dataType: "String",
  38. cellType: 'tipsCell'
  39. },
  40. {
  41. headerName: "规格型号",
  42. headerWidth: 120,
  43. dataCode: "specs",
  44. hAlign: "left",
  45. dataType: "String",
  46. cellType: 'tipsCell'
  47. },
  48. {
  49. headerName: "单位",
  50. headerWidth: 45,
  51. dataCode: "unit",
  52. hAlign: "center",
  53. dataType: "String"
  54. },
  55. {
  56. headerName: "数量",
  57. headerWidth: 90,
  58. dataCode: "quantity",
  59. hAlign: "right",
  60. dataType: "Number",
  61. validator: "number"
  62. }, //decimalField:'glj.quantity'
  63. {
  64. headerName: "暂定价",
  65. headerWidth: 70,
  66. dataCode: "marketPrice",
  67. hAlign: "right",
  68. dataType: "Number",
  69. validator: "number"
  70. },
  71. {
  72. headerName: "合价",
  73. headerWidth: 90,
  74. dataCode: "totalPrice",
  75. hAlign: "right",
  76. dataType: "Number",
  77. validator: "number",
  78. decimalField: 'bills.totalPrice'
  79. },
  80. {
  81. headerName: "锁定",
  82. headerWidth: 80,
  83. dataCode: "locked",
  84. hAlign: "left",
  85. dataType: "String",
  86. cellType: 'checkBox'
  87. },
  88. {
  89. headerName: "产地",
  90. headerWidth: 80,
  91. dataCode: "originPlace",
  92. hAlign: "left",
  93. dataType: "String",
  94. visible: false
  95. },
  96. {
  97. headerName: "厂家",
  98. headerWidth: 80,
  99. dataCode: "vender",
  100. hAlign: "left",
  101. dataType: "String",
  102. visible: false
  103. },
  104. {
  105. headerName: "备注",
  106. headerWidth: 100,
  107. dataCode: "remark",
  108. hAlign: "left",
  109. dataType: "String"
  110. }
  111. ],
  112. view: {
  113. lockColumns: ["is_related", "totalPrice", "originPlace", "vender", "quantity"]
  114. }
  115. },
  116. bidMaterialSetting: {
  117. header: [{
  118. headerName: "关联",
  119. headerWidth: 80,
  120. dataCode: "is_related",
  121. dataType: "String",
  122. cellType: 'checkBox'
  123. },
  124. {
  125. headerName: "序号",
  126. headerWidth: 80,
  127. dataCode: "seq",
  128. dataType: "String",
  129. formatter: "@"
  130. },
  131. {
  132. headerName: "材料号",
  133. headerWidth: 80,
  134. dataCode: "code",
  135. dataType: "String",
  136. formatter: "@"
  137. },
  138. {
  139. headerName: "材料名称",
  140. headerWidth: 160,
  141. dataCode: "name",
  142. dataType: "String",
  143. cellType: 'tipsCell'
  144. },
  145. {
  146. headerName: "规格型号",
  147. headerWidth: 120,
  148. dataCode: "specs",
  149. hAlign: "left",
  150. dataType: "String",
  151. cellType: 'tipsCell'
  152. },
  153. {
  154. headerName: "单位",
  155. headerWidth: 45,
  156. dataCode: "unit",
  157. hAlign: "center",
  158. dataType: "String"
  159. },
  160. {
  161. headerName: "数量",
  162. headerWidth: 90,
  163. dataCode: "quantity",
  164. hAlign: "right",
  165. dataType: "Number",
  166. validator: "number"
  167. }, //decimalField:'glj.quantity'
  168. {
  169. headerName: "单价",
  170. headerWidth: 70,
  171. dataCode: "marketPrice",
  172. hAlign: "right",
  173. dataType: "Number",
  174. validator: "number"
  175. },
  176. {
  177. headerName: "合价",
  178. headerWidth: 90,
  179. dataCode: "totalPrice",
  180. hAlign: "right",
  181. dataType: "Number",
  182. validator: "number",
  183. decimalField: 'bills.totalPrice'
  184. },
  185. {
  186. headerName: "产地",
  187. headerWidth: 80,
  188. dataCode: "originPlace",
  189. hAlign: "left",
  190. dataType: "String",
  191. visible: false
  192. },
  193. {
  194. headerName: "厂家",
  195. headerWidth: 80,
  196. dataCode: "vender",
  197. hAlign: "left",
  198. dataType: "String",
  199. visible: false
  200. },
  201. {
  202. headerName: "备注",
  203. headerWidth: 100,
  204. dataCode: "remark",
  205. hAlign: "left",
  206. dataType: "String"
  207. }
  208. ],
  209. view: {
  210. lockColumns: ["is_related", "totalPrice", "originPlace", "vender", "quantity"]
  211. }
  212. },
  213. evaluateRelateSetting: {
  214. header: [{
  215. headerName: "关联",
  216. headerWidth: 80,
  217. dataCode: "is_related",
  218. dataType: "String",
  219. cellType: 'checkBox'
  220. },
  221. {
  222. headerName: "编码",
  223. headerWidth: 80,
  224. dataCode: "code",
  225. dataType: "String"
  226. },
  227. {
  228. headerName: "类别",
  229. headerWidth: 45,
  230. dataCode: "short_name",
  231. hAlign: "center",
  232. dataType: "String"
  233. },
  234. {
  235. headerName: "名称",
  236. headerWidth: 160,
  237. dataCode: "name",
  238. dataType: "String",
  239. cellType: 'tipsCell'
  240. },
  241. {
  242. headerName: "规格型号",
  243. headerWidth: 120,
  244. dataCode: "specs",
  245. hAlign: "left",
  246. dataType: "String",
  247. cellType: 'tipsCell'
  248. },
  249. {
  250. headerName: "单位",
  251. headerWidth: 45,
  252. dataCode: "unit",
  253. hAlign: "center",
  254. dataType: "String"
  255. },
  256. {
  257. headerName: "数量",
  258. headerWidth: 90,
  259. dataCode: "quantity",
  260. hAlign: "right",
  261. dataType: "Number",
  262. decimalField: 'glj.quantity'
  263. },
  264. {
  265. headerName: "定额价",
  266. headerWidth: 70,
  267. dataCode: "basePrice",
  268. hAlign: "right",
  269. dataType: "Number",
  270. validator: "number"
  271. },
  272. {
  273. headerName: "市场价",
  274. headerWidth: 70,
  275. dataCode: "marketPrice",
  276. hAlign: "right",
  277. dataType: "Number",
  278. validator: "number"
  279. },
  280. {
  281. headerName: "合价",
  282. headerWidth: 90,
  283. dataCode: "totalPrice",
  284. hAlign: "right",
  285. dataType: "Number",
  286. validator: "number",
  287. decimalField: 'bills.totalPrice'
  288. },
  289. /* {headerName: "供货方式", headerWidth: 70, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
  290. {headerName: "产地", headerWidth: 80, dataCode: "originPlace", hAlign: "left", dataType: "String"},
  291. {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String"}, */
  292. {
  293. headerName: "备注",
  294. headerWidth: 100,
  295. dataCode: "remark",
  296. hAlign: "left",
  297. dataType: "String"
  298. }
  299. ],
  300. view: {
  301. lockColumns: ["code", "type", "name", "specs", "unit", "quantity", "marketPrice", "basePrice", "supply", "originPlace", "vender", "remark"]
  302. }
  303. },
  304. initSpread: function () {
  305. if (!this.configSpread) {
  306. this.configSpread = SheetDataHelper.createNewSpread($("#config_material_sheet")[0], 4);
  307. sheetCommonObj.spreadDefaultStyle(this.configSpread);
  308. this.relatedSpread = SheetDataHelper.createNewSpread($("#related_sheet")[0], 4);
  309. sheetCommonObj.spreadDefaultStyle(this.relatedSpread);
  310. }
  311. this.initEvaluateMaterialSheet();
  312. this.initbidMaterialSheet();
  313. this.initEvaluateRelateSheet();
  314. //打开别人分享的项目,只读
  315. if (projectReadOnly) {
  316. sheetCommonObj.disableSpread(this.configSpread);
  317. sheetCommonObj.disableSpread(this.relatedSpread);
  318. } else {
  319. this.initRightClick();
  320. }
  321. },
  322. initEvaluateMaterialSheet: function () {
  323. this.evaluateMaterialSheet = this.configSpread.getSheet(0);
  324. sheetCommonObj.initSheet(this.evaluateMaterialSheet, this.evaluateMaterialSetting, 30);
  325. this.evaluateMaterialSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onEvaluateMaterialValueChange);
  326. this.evaluateMaterialSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, this.onEvaluateMaterialSelectionChange);
  327. this.evaluateMaterialSheet.bind(GC.Spread.Sheets.Events.EditStarting, this.onEvaluateMaterialEditStarting);
  328. this.evaluateMaterialSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
  329. this.evaluateMaterialSheet.name('evaluateMaterialSheet');
  330. this.evaluateMaterialSheet.setRowHeight(0, 36, 1);
  331. },
  332. initbidMaterialSheet: function () {
  333. this.bidMaterialSheet = this.configSpread.getSheet(1);
  334. sheetCommonObj.initSheet(this.bidMaterialSheet, this.bidMaterialSetting, 30);
  335. this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onBidEvaluateMaterialValueChange);
  336. this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, this.onEvaluateMaterialSelectionChange);
  337. this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.EditStarting, this.onBitMaterialEditStarting);
  338. this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
  339. this.bidMaterialSheet.name('bidMaterialSheet');
  340. this.bidMaterialSheet.setRowHeight(0, 36, 1);
  341. },
  342. initEvaluateRelateSheet: function () {
  343. this.evaluateRelateSheet = this.relatedSpread.getSheet(0);
  344. sheetCommonObj.initSheet(this.evaluateRelateSheet, this.evaluateRelateSetting, 30);
  345. this.evaluateRelateSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onEvaluateRelateValueChange);
  346. this.evaluateRelateSheet.bind(GC.Spread.Sheets.Events.EditStarting, this.onEvaluateRelateEditStarting);
  347. //this.evaluateRelateSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
  348. this.evaluateRelateSheet.name('evaluateRelateSheet');
  349. this.evaluateRelateSheet.setRowHeight(0, 36, 1);
  350. },
  351. showEvaluateMaterialDatas: function () {
  352. this.configSpread.setActiveSheetIndex(0);
  353. let sel = this.evaluateMaterialSheet.getSelections()[0];
  354. let oldData = sel.row < this.evaluateMaterialDatas.length ? this.evaluateMaterialDatas[sel.row] : "";
  355. this.evaluateMaterialDatas = this.getEvaluateMaterialDatas();
  356. sheetCommonObj.showData(this.evaluateMaterialSheet, this.evaluateMaterialSetting, this.evaluateMaterialDatas);
  357. this.evaluateMaterialSheet.setRowCount(this.evaluateMaterialDatas.length);
  358. sel.row = oldData ? _.findIndex(this.evaluateMaterialDatas, {
  359. 'ID': oldData.ID
  360. }) : '';
  361. this.evaluateMaterialSheet.setSelection(sel.row == -1 ? 0 : sel.row, sel.col, sel.rowCount, sel.colCount);
  362. },
  363. showBidMaterialDatas: function () {
  364. this.configSpread.setActiveSheetIndex(1);
  365. let sel = this.bidMaterialSheet.getSelections()[0];
  366. let oldData = sel.row < this.bidMaterialDatas.length ? this.bidMaterialDatas[sel.row] : "";
  367. this.bidMaterialDatas = this.getBidMaterialDatas();
  368. sheetCommonObj.showData(this.bidMaterialSheet, this.bidMaterialSetting, this.bidMaterialDatas);
  369. this.bidMaterialSheet.setRowCount(this.bidMaterialDatas.length);
  370. sel.row = oldData ? _.findIndex(this.bidMaterialDatas, {
  371. 'ID': oldData.ID
  372. }) : '';
  373. this.bidMaterialSheet.setSelection(sel.row == -1 ? 0 : sel.row, sel.col, sel.rowCount, sel.colCount);
  374. },
  375. showEvaluateRelateDatas: function () {
  376. this.relatedSpread.setActiveSheetIndex(0);
  377. this.evaluateRelateDatas = this.getEvaluateRelateDatas();
  378. sheetCommonObj.showData(this.evaluateRelateSheet, this.evaluateRelateSetting, this.evaluateRelateDatas);
  379. this.evaluateRelateSheet.setRowCount(this.evaluateRelateDatas.length);
  380. },
  381. refreshSheetDatas: function () {
  382. if (projectGljObject.displayType == filterType.ZGCL) {
  383. this.showEvaluateMaterialDatas();
  384. } else if (projectGljObject.displayType == filterType.PBCL) {
  385. this.showBidMaterialDatas();
  386. }
  387. this.showEvaluateRelateDatas();
  388. },
  389. setNavLinkText: function (type) {
  390. let text = "关联暂估材料";
  391. switch (type) {
  392. case filterType.ZGCL:
  393. text = "关联暂估材料";
  394. break;
  395. case filterType.PBCL:
  396. text = "关联评标材料";
  397. break;
  398. case filterType.AMAE:
  399. text = "关联材料";
  400. break;
  401. }
  402. $("#related_link").text(text);
  403. },
  404. getEvaluateRelateDatas: function () {
  405. //$('filterGljName')
  406. let name = '',
  407. datas = [],
  408. sheet = null,
  409. field = '',
  410. rdata = [];
  411. switch (projectGljObject.displayType) {
  412. case filterType.ZGCL:
  413. sheet = this.evaluateMaterialSheet;
  414. datas = this.evaluateMaterialDatas;
  415. field = "is_evaluate";
  416. break;
  417. case filterType.PBCL:
  418. sheet = this.bidMaterialSheet;
  419. datas = this.bidMaterialDatas;
  420. field = "is_eval_material";
  421. break;
  422. case filterType.AMAE:
  423. sheet = materialAdjustObj.getSheet();
  424. datas = materialAdjustObj.getSheetDatas();
  425. field = "is_contractor_material";
  426. }
  427. let sel = sheet.getSelections()[0];
  428. let srow = sel.row == -1 || sel.row == "" ? 0 : sel.row;
  429. if (gljUtil.isDef(srow) && datas.length > srow) {
  430. name = this.relateFilterAgain == true ? $('#filterGljName').val() : datas[srow].name;
  431. rdata = this.filterEvaluateRelate(name, datas[srow].projectGLJID, field);
  432. }
  433. if (this.relateFilterAgain == false) $('#filterGljName').val(name);
  434. return rdata;
  435. },
  436. filterEvaluateRelate: function (name, projectGLJID, relateField) {
  437. let datas = [];
  438. let projectGLJ = projectObj.project.projectGLJ;
  439. let materialIdList = projectGLJ.datas.constData.materialIdList;
  440. for (let d of projectGLJ.datas.gljList) {
  441. if (parseFloat(d.quantity) > 0) { //材料类型//materialIdList.indexOf(d.type) >= 0 &&
  442. if (projectGljObject.displayType != filterType.AMAE) {
  443. if (materialIdList.indexOf(d.type) == -1) continue;
  444. }
  445. if (d[relateField] == 1 && d.id != projectGLJID) continue; //排除其它已被关联的工料机
  446. if (name != '') { //name为''时不做过滤
  447. const gljName = d.name.replace(/(/g, '(').replace(/)/g, ')');
  448. name = name.replace(/(/g, '(').replace(/)/g, ')');
  449. if (gljName.indexOf(name) == -1) {
  450. if (!(d[relateField] == 1 && d.id == projectGLJID)) continue; //虽然不匹配,但是是关联的暂估材料,这时应该显示
  451. }
  452. }
  453. let t = {
  454. id: d.id,
  455. code: d.code,
  456. type: d.type,
  457. short_name: projectGLJ.getShortNameByID(d.type),
  458. name: d.name,
  459. specs: d.specs,
  460. unit: d.unit,
  461. quantity: d.quantity,
  462. supply: d.supply,
  463. originPlace: d.originPlace,
  464. vender: d.vender,
  465. remark: d.remark,
  466. from: d
  467. };
  468. t.is_related = d[relateField] ? 1 : 0;
  469. gljOprObj.setGLJPrice(t, d);
  470. t.totalPrice = scMathUtil.roundForObj(t.quantity * t.marketPrice, getDecimal('bills.totalPrice'));
  471. datas.push(t);
  472. }
  473. }
  474. return _.sortByAll(datas, 'code');
  475. },
  476. getEvaluateMaterialDatas: function (projectGLJList, evaluateList, decimalObj) {
  477. projectGLJList = projectGLJList ? projectGLJList : projectObj.project.projectGLJ.datas.gljList;
  478. evaluateList = evaluateList ? evaluateList : projectObj.project.evaluate_list.datas;
  479. const billsDecimal = decimalObj ? decimalObj.bills.totalPrice : getDecimal('bills.totalPrice');
  480. let datas = [];
  481. let gljMap = _.indexBy(projectGLJList, 'id');
  482. for (let e of evaluateList) {
  483. let t = {
  484. ID: e.ID,
  485. projectID: e.projectID,
  486. is_related: e.is_related, //关联,1关,0不关
  487. projectGLJID: e.projectGLJID, //关联工料机ID
  488. seq: e.seq, //序号
  489. code: e.code,
  490. name: e.name,
  491. specs: e.specs,
  492. unit: e.unit,
  493. type: e.type,
  494. marketPrice: e.market_price,
  495. quantity: e.quantity,
  496. locked: e.locked, //锁定,1锁,0不锁
  497. remark: e.remark,
  498. originPlace: e.originPlace, //产地
  499. vender: e.vender //厂家
  500. };
  501. let pglj = gljMap[e.projectGLJID];
  502. if (e.is_related && pglj) {
  503. gljOprObj.setGLJPrice(t, pglj);
  504. t.originPlace = pglj.originPlace;
  505. t.vender = pglj.vender;
  506. t.brand = pglj.brand;
  507. t.qualityGrace = pglj.qualityGrace;
  508. t.remark = pglj.remark;
  509. t.quantity = pglj.quantity;
  510. }
  511. t.totalPrice = scMathUtil.roundForObj(parseFloat(t.quantity) * parseFloat(t.marketPrice), billsDecimal);
  512. datas.push(t);
  513. }
  514. return _.sortByAll(datas, 'code');
  515. },
  516. getBidMaterialDatas: function (projectGLJList, bidEvaluationList, decimalObj) {
  517. projectGLJList = projectGLJList ? projectGLJList : projectObj.project.projectGLJ.datas.gljList;
  518. bidEvaluationList = bidEvaluationList ? bidEvaluationList : projectObj.project.bid_evaluation_list.datas;
  519. const billsDecimal = decimalObj ? decimalObj.bills.totalPrice : getDecimal('bills.totalPrice');
  520. let datas = [];
  521. let gljMap = _.indexBy(projectGLJList, 'id');
  522. for (let e of bidEvaluationList) {
  523. let t = {
  524. ID: e.ID,
  525. projectID: e.projectID,
  526. is_related: e.is_related, //关联,1关,0不关
  527. projectGLJID: e.projectGLJID, //关联工料机ID
  528. seq: e.seq, //序号
  529. code: e.code,
  530. name: e.name,
  531. specs: e.specs,
  532. unit: e.unit,
  533. type: e.type,
  534. marketPrice: e.market_price,
  535. quantity: e.quantity,
  536. remark: e.remark,
  537. originPlace: e.originPlace, //产地
  538. is_evaluate: 0,
  539. vender: e.vender //厂家
  540. };
  541. let pglj = gljMap[e.projectGLJID];
  542. if (e.is_related && pglj) {
  543. gljOprObj.setGLJPrice(t, pglj);
  544. t.originPlace = pglj.originPlace;
  545. t.vender = pglj.vender;
  546. t.brand = pglj.brand;
  547. t.qualityGrace = pglj.qualityGrace;
  548. t.quantity = pglj.quantity;
  549. t.is_evaluate = pglj.is_evaluate;
  550. }
  551. t.totalPrice = scMathUtil.roundForObj(parseFloat(t.quantity) * parseFloat(t.marketPrice), billsDecimal);
  552. datas.push(t);
  553. }
  554. return _.sortByAll(datas, 'code');
  555. },
  556. updateConfigMaterial: function (dataCode, value, recode) {
  557. let task = [];
  558. for (let t of projectObj.project.projectGLJ.datas.gljList) {
  559. this.GLJIDMap[t.id] = t;
  560. }
  561. let glj = this.GLJIDMap[recode.id];
  562. if (!glj) return;
  563. let pdata = {
  564. doc: {},
  565. action: 'update'
  566. };
  567. pdata['type'] = 'glj_list';
  568. pdata.doc[dataCode] = value;
  569. pdata['id'] = glj.id;
  570. task.push(pdata);
  571. this.getEvaluateUpdateTasks(value, glj, dataCode, task);
  572. this.updateEvaluateMaterial(task, dataCode == "is_evaluate");
  573. },
  574. updateEvaluateMaterial: async function (data, refreshEvaluate = true) {
  575. try {
  576. $.bootstrapLoading.start();
  577. let result = await ajaxPost('/glj/updateEvaluateMaterial', {
  578. tasks: data
  579. });
  580. //先刷新缓存
  581. let [gljs, sendPriceChange] = this.refreshCache(data);
  582. if (refreshEvaluate == true) {
  583. let [rationNodes, impactGLJs] = projectObj.project.projectGLJ.batchChangeIsEvaluate(gljs);
  584. projectObj.project.calcProgram.calcNodesAndSave(rationNodes, function () {
  585. projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots);
  586. });
  587. }
  588. projectGljObject.refreshViewsData();
  589. gljOprObj.refreshView();
  590. if (sendPriceChange == true) projectGljObject.onUnitFileChange();
  591. } catch (e) {
  592. console.log(e)
  593. } finally {
  594. $.bootstrapLoading.end();
  595. }
  596. },
  597. refreshCache: function (tasks) {
  598. let gljs = [];
  599. let sendPriceChange = false;
  600. for (let t of tasks) {
  601. if (t.type == "evaluate_list") {
  602. refreshDatas(projectObj.project.evaluate_list.datas, t);
  603. } else if (t.type == "bid_evaluation_list") {
  604. refreshDatas(projectObj.project.bid_evaluation_list.datas, t);
  605. } else if (t.type == "contractor_list") {
  606. refreshDatas(projectObj.project.contractor_list.datas, t);
  607. } else {
  608. if (_.isEmpty(this.GLJIDMap)) this.GLJIDMap = _.indexBy(projectObj.project.projectGLJ.datas.gljList, 'id');
  609. //剩下两个类型只有更新操作
  610. if (t.type == "unit_price") {
  611. let g = this.GLJIDMap[t.projectGLJID];
  612. if (g) {
  613. let f = updateProperty(g.unit_price, t.doc);
  614. if (f == true) sendPriceChange = true;
  615. gljs.push(g);
  616. }
  617. }
  618. if (t.type == "glj_list") {
  619. let g = this.GLJIDMap[t.id];
  620. if (g) {
  621. let f = updateProperty(g, t.doc);
  622. if (f == true) sendPriceChange = true;
  623. gljs.push(g);
  624. }
  625. }
  626. }
  627. }
  628. this.GLJIDMap = {};
  629. return [gljs, sendPriceChange];
  630. function refreshDatas(datas, t_t) {
  631. if (t_t.action == "update") {
  632. let e = _.find(datas, {
  633. 'ID': t_t.ID
  634. });
  635. if (e) updateProperty(e, t_t.doc);
  636. }
  637. if (t_t.action == "add") datas.push(t_t.doc);
  638. if (t_t.action == "delete") _.remove(datas, {
  639. 'ID': t_t.ID
  640. });
  641. }
  642. function updateProperty(obj, doc) {
  643. let updatePrice = false;
  644. for (let k in doc) {
  645. obj[k] = doc[k];
  646. if (k == 'base_price' || k == 'market_price') updatePrice = true;
  647. }
  648. return updatePrice;
  649. }
  650. },
  651. getEvaluateUpdateTasks: function (value, glj, dataCode, task) {
  652. let dataList = [],
  653. modelType = 'evaluate_list';
  654. if (dataCode == 'is_evaluate') {
  655. dataList = projectObj.project.evaluate_list.datas;
  656. modelType = 'evaluate_list';
  657. } else if (dataCode == 'is_eval_material') {
  658. dataList = projectObj.project.bid_evaluation_list.datas;
  659. modelType = 'bid_evaluation_list';
  660. }
  661. if (value == 1) { //勾选暂估选项,查看已有的暂估材料列表中是否有名称,编号等完全相同的记录,有则直接关联,无则添加
  662. let evaluate = null;
  663. let pindex = gljUtil.getIndex(glj, gljUtil.materialKeyArray);
  664. for (let e of dataList) {
  665. let eIndex = gljUtil.getIndex(e, gljUtil.materialKeyArray);
  666. if (pindex == eIndex) {
  667. evaluate = e;
  668. break;
  669. }
  670. }
  671. if (evaluate) { //有找到则更新,没有则添加
  672. let edata = {
  673. type: modelType,
  674. doc: {},
  675. action: "update",
  676. ID: evaluate.ID
  677. };
  678. edata.doc = {
  679. projectGLJID: glj.id,
  680. is_related: 1
  681. };
  682. task.push(edata);
  683. if (dataCode == 'is_evaluate') {
  684. let udata = {
  685. type: 'unit_price',
  686. doc: {},
  687. action: "update",
  688. projectGLJID: glj.id,
  689. id: glj.unit_price.id
  690. };
  691. //if(evaluate.base_price != glj.unit_price.base_price) udata.doc['base_price'] = evaluate.base_price;
  692. if (evaluate.market_price != glj.unit_price.market_price) udata.doc['market_price'] = evaluate.market_price;
  693. if (!_.isEmpty(udata.doc)) task.push(udata);
  694. }
  695. } else {
  696. let ndata = {
  697. type: modelType,
  698. doc: {},
  699. action: "add"
  700. };
  701. ndata.doc['ID'] = uuid.v1();
  702. ndata.doc['projectGLJID'] = glj.id;
  703. ndata.doc['is_related'] = 1;
  704. if (dataCode == 'is_evaluate') ndata.doc['locked'] = 0;
  705. ndata.doc['seq'] = glj.code;
  706. ndata.doc['projectID'] = glj.project_id;
  707. ndata.doc['code'] = glj.code;
  708. ndata.doc['name'] = glj.name;
  709. ndata.doc['specs'] = glj.specs;
  710. ndata.doc['unit'] = glj.unit;
  711. ndata.doc['quantity'] = glj.quantity;
  712. ndata.doc['type'] = glj.type;
  713. ndata.doc['market_price'] = glj.unit_price.market_price;
  714. ndata.doc['originPlace'] = glj.originPlace;
  715. ndata.doc['vender'] = glj.vender;
  716. ndata.doc['remark'] = glj.remark;
  717. task.push(ndata);
  718. }
  719. } else if (value == 0) {
  720. let t_evaluate = null;
  721. for (let e of dataList) {
  722. if (e.projectGLJID == glj.id && e.is_related == 1) {
  723. t_evaluate = e;
  724. break;
  725. }
  726. }
  727. if (t_evaluate) {
  728. let tdata = {
  729. type: modelType,
  730. doc: {
  731. is_related: 0,
  732. quantity: '0'
  733. },
  734. action: "update",
  735. ID: t_evaluate.ID
  736. };
  737. task.push(tdata);
  738. }
  739. }
  740. },
  741. onEvaluateMaterialSelectionChange: function (sender, args) {
  742. let me = configMaterialObj;
  743. let newSel = args.newSelections[0];
  744. let oldSel = args.oldSelections ? args.oldSelections[0] : {};
  745. if (newSel.row != oldSel.row) {
  746. me.showEvaluateRelateDatas();
  747. me.relateFilterAgain = false;
  748. }
  749. },
  750. onBidEvaluateMaterialValueChange: function (e, info) {
  751. let me = configMaterialObj,
  752. row = info.row,
  753. col = info.col;
  754. let dataCode = me.bidMaterialSetting.header[col].dataCode;
  755. let value = info.newValue;
  756. let bid = me.bidMaterialDatas[row];
  757. if (value && !sheetCommonObj.checkData(col, me.bidMaterialSetting, value)) {
  758. alert('输入的数据类型不对,请重新输入!');
  759. return me.showBidMaterialDatas();
  760. }
  761. if (dataCode == 'marketPrice') {
  762. dataCode = 'market_price';
  763. if (bid.is_related) { //关联的情况下,直接修改工料机价格
  764. if (bid.is_evaluate == 1) {
  765. alert("当前材料市场价已被锁定,修改请先返回人材机汇总界面解除锁定。");
  766. return me.showBidMaterialDatas();
  767. }
  768. return projectObj.project.projectGLJ.updatePrice(bid, dataCode, value, 'rg', projectGljObject.refreshViewsData);
  769. }
  770. value = scMathUtil.roundToString(value, getDecimal('glj.unitPrice'));
  771. }
  772. if (value && dataCode === 'quantity') { //修改数量需做4舍5入
  773. value = scMathUtil.roundToString(value, getDecimal('glj.quantity'));
  774. }
  775. let edata = {
  776. type: 'bid_evaluation_list',
  777. doc: {},
  778. action: "update",
  779. ID: bid.ID
  780. };
  781. if (bid[dataCode] == value) return me.showBidMaterialDatas();
  782. edata.doc[dataCode] = value;
  783. me.updateEvaluateMaterial([edata], false);
  784. },
  785. onSheetRangeChange: function (e, args) {
  786. let me = configMaterialObj,
  787. updateMap = {},
  788. modelType = '',
  789. setting = {},
  790. datas = [],
  791. tasks = [];
  792. switch (projectGljObject.displayType) {
  793. case filterType.ZGCL:
  794. modelType = "evaluate_list";
  795. setting = me.evaluateMaterialSetting;
  796. datas = me.evaluateMaterialDatas;
  797. break;
  798. case filterType.PBCL:
  799. modelType = "bid_evaluation_list";
  800. setting = me.bidMaterialSetting;
  801. datas = me.bidMaterialDatas;
  802. break;
  803. }
  804. for (let c of args.changedCells) {
  805. let dataCode = setting.header[c.col].dataCode;
  806. let value = args.sheet.getCell(c.row, c.col).text();
  807. let recode = datas[c.row];
  808. if (me.editChecking(recode, dataCode, modelType == "evaluate_list") == false) {
  809. me.refreshSheetDatas();
  810. return;
  811. }
  812. if (value && !sheetCommonObj.checkData(c.col, setting, value)) {
  813. alert('输入的数据类型不对,请重新输入!');
  814. me.refreshSheetDatas();
  815. return;
  816. }
  817. if (dataCode == 'marketPrice') {
  818. dataCode = 'market_price';
  819. if (recode.is_related) { //关联的情况下,直接修改工料机价格 暂时不支持批量修改
  820. return projectObj.project.projectGLJ.updatePrice(recode, dataCode, value, 'rg', null, projectGljObject.refreshViewsData);
  821. }
  822. } else {
  823. let tem = updateMap[recode.ID] ? updateMap[recode.ID] : {};
  824. if (value && dataCode === 'quantity') value = scMathUtil.roundToString(value, getDecimal('glj.quantity')); //修改数量需做4舍5入
  825. if (value == recode[dataCode]) continue;
  826. tem[dataCode] = value;
  827. updateMap[recode.ID] = tem;
  828. }
  829. }
  830. for (let ID in updateMap) {
  831. let edata = {
  832. type: modelType,
  833. doc: updateMap[ID],
  834. action: "update",
  835. ID: ID
  836. };
  837. tasks.push(edata);
  838. }
  839. if (tasks.length > 0) me.updateEvaluateMaterial(tasks, false);
  840. },
  841. onEvaluateMaterialValueChange: function (e, info) {
  842. let me = configMaterialObj,
  843. row = info.row,
  844. col = info.col;
  845. let dataCode = me.evaluateMaterialSetting.header[col].dataCode;
  846. let value = info.newValue;
  847. let evaluate = me.evaluateMaterialDatas[row];
  848. if (value && !sheetCommonObj.checkData(col, me.evaluateMaterialSetting, value)) {
  849. alert('输入的数据类型不对,请重新输入!');
  850. return me.showEvaluateMaterialDatas();
  851. }
  852. if (dataCode == 'locked') value = value == true ? 1 : 0;
  853. if (dataCode == 'marketPrice') {
  854. dataCode = 'market_price';
  855. if (evaluate.is_related) { //关联的情况下,直接修改工料机价格
  856. return projectObj.project.projectGLJ.updatePrice(evaluate, dataCode, value, 'rg', projectGljObject.refreshViewsData);
  857. }
  858. }
  859. if (value && dataCode === 'quantity') { //修改数量需做4舍5入
  860. value = scMathUtil.roundToString(value, getDecimal('glj.quantity'));
  861. }
  862. let edata = {
  863. type: 'evaluate_list',
  864. doc: {},
  865. action: "update",
  866. ID: evaluate.ID
  867. };
  868. if (evaluate[dataCode] == value) return me.showEvaluateMaterialDatas();
  869. edata.doc[dataCode] = value;
  870. me.updateEvaluateMaterial([edata], false);
  871. },
  872. onEvaluateRelateValueChange: function (e, info) {
  873. let me = configMaterialObj,
  874. row = info.row,
  875. col = info.col;
  876. let value = info.newValue;
  877. let sheet = null,
  878. datas = [],
  879. field = "",
  880. type = "";
  881. switch (projectGljObject.displayType) {
  882. case filterType.ZGCL:
  883. sheet = me.evaluateMaterialSheet;
  884. datas = me.evaluateMaterialDatas;
  885. field = "is_evaluate";
  886. type = "evaluate_list";
  887. break;
  888. case filterType.PBCL:
  889. sheet = me.bidMaterialSheet;
  890. datas = me.bidMaterialDatas;
  891. field = "is_eval_material";
  892. type = "bid_evaluation_list";
  893. break;
  894. case filterType.AMAE:
  895. sheet = materialAdjustObj.getSheet();
  896. datas = materialAdjustObj.getSheetDatas();
  897. field = "is_contractor_material";
  898. type = "contractor_list";
  899. }
  900. let sel = sheet.getSelections()[0];
  901. let srow = sel.row == -1 || sel.row == "" ? 0 : sel.row;
  902. let task = [];
  903. value = value == true ? 1 : 0;
  904. if (datas.length > srow) {
  905. let evaluate = datas[srow];
  906. let relate = me.evaluateRelateDatas[row];
  907. let pdata = {
  908. id: relate.id,
  909. doc: {},
  910. action: 'update',
  911. type: "glj_list"
  912. };
  913. pdata.doc[field] = value;
  914. task.push(pdata);
  915. let tdata = {
  916. type: type,
  917. doc: {},
  918. action: "update",
  919. ID: evaluate.ID
  920. };
  921. if (value == 0) { //如果是0的话
  922. tdata.doc = {
  923. is_related: 0,
  924. quantity: '0'
  925. };
  926. } else {
  927. if (relate.unit != evaluate.unit) { //检查单位是否相同,如果不同不能关联
  928. alert("单位不一致,不允许关联!");
  929. return me.showEvaluateRelateDatas();
  930. }
  931. //如果已经关联了其它项目工料机,要把那个项目工料机的是否暂估标记为否
  932. if (evaluate.is_related == 1) {
  933. let tdoc = {};
  934. tdoc[field] = 0;
  935. task.push({
  936. id: evaluate.projectGLJID,
  937. doc: tdoc,
  938. action: 'update',
  939. type: "glj_list"
  940. });
  941. }
  942. //更新暂估材料的工料机ID,和关联标记
  943. tdata.doc = {
  944. projectGLJID: relate.id,
  945. code: relate.code,
  946. is_related: 1
  947. };
  948. if (projectGljObject.displayType == filterType.ZGCL) {
  949. //更新新关联工料机的市场价格
  950. let udata = {
  951. type: 'unit_price',
  952. doc: {},
  953. action: "update",
  954. projectGLJID: relate.from.id,
  955. id: relate.from.unit_price.id
  956. };
  957. //if(evaluate.base_price != relate.from.unit_price.base_price) udata.doc['base_price'] = evaluate.base_price;
  958. if (evaluate.marketPrice != relate.from.unit_price.market_price) udata.doc['market_price'] = evaluate.marketPrice;
  959. if (!_.isEmpty(udata.doc)) task.push(udata);
  960. }
  961. }
  962. task.push(tdata);
  963. me.updateEvaluateMaterial(task);
  964. }
  965. },
  966. deleteMaterial: function (row) {
  967. let me = configMaterialObj;
  968. let evaluate = {},
  969. task = [],
  970. type = '',
  971. field = '';
  972. switch (projectGljObject.displayType) {
  973. case filterType.ZGCL:
  974. evaluate = me.evaluateMaterialDatas[row];
  975. field = "is_evaluate";
  976. type = "evaluate_list";
  977. break;
  978. case filterType.PBCL:
  979. evaluate = me.bidMaterialDatas[row];
  980. field = "is_eval_material";
  981. type = "bid_evaluation_list";
  982. break;
  983. case filterType.AMAE:
  984. let t_datas = materialAdjustObj.getSheetDatas();
  985. evaluate = t_datas[row];
  986. field = "is_contractor_material";
  987. type = "contractor_list";
  988. }
  989. if (evaluate) {
  990. task.push({
  991. type: type,
  992. action: "delete",
  993. ID: evaluate.ID
  994. });
  995. if (evaluate.is_related == 1) { //如果关联了工料机,则要把工料机标记为不是暂估
  996. let tdoc = {};
  997. tdoc[field] = 0;
  998. task.push({
  999. id: evaluate.projectGLJID,
  1000. doc: tdoc,
  1001. action: 'update',
  1002. type: "glj_list"
  1003. })
  1004. }
  1005. me.updateEvaluateMaterial(task);
  1006. }
  1007. },
  1008. onEvaluateMaterialEditStarting: function (sender, args) {
  1009. let me = configMaterialObj;
  1010. let row = args.row,
  1011. col = args.col;
  1012. let evaluate = me.evaluateMaterialDatas[row];
  1013. let dataCode = me.evaluateMaterialSetting.header[col].dataCode;
  1014. if (me.editChecking(evaluate, dataCode, true) == false) args.cancel = true;
  1015. },
  1016. editChecking: function (record, dataCode, checkLock = false) { //return false 为不能编辑
  1017. if (checkLock && record.locked) return false;
  1018. if ((dataCode == 'quantity' || dataCode == 'unit') && record.is_related) return false; //在关联的情况下,数量和单位不可编辑
  1019. return true;
  1020. },
  1021. onBitMaterialEditStarting: function (sender, args) {
  1022. let me = configMaterialObj;
  1023. let row = args.row,
  1024. col = args.col;
  1025. let bid = me.bidMaterialDatas[row];
  1026. let dataCode = me.bidMaterialSetting.header[col].dataCode;
  1027. if (me.editChecking(bid, dataCode) == false) args.cancel = true;
  1028. },
  1029. onEvaluateRelateEditStarting: function (sender, args) {
  1030. let me = configMaterialObj;
  1031. let row = args.row,
  1032. col = args.col;
  1033. args.cancel = true;
  1034. },
  1035. insertEmptyRow: function () {
  1036. let m_t = "";
  1037. switch (projectGljObject.displayType) {
  1038. case filterType.ZGCL:
  1039. m_t = "evaluate_list";
  1040. break;
  1041. case filterType.PBCL:
  1042. m_t = "bid_evaluation_list";
  1043. break;
  1044. }
  1045. let ndata = {
  1046. type: m_t,
  1047. doc: {},
  1048. action: "add"
  1049. };
  1050. ndata.doc['ID'] = uuid.v1();
  1051. ndata.doc['is_related'] = 0;
  1052. if (m_t == "evaluate_list") ndata.doc['locked'] = 0;
  1053. ndata.doc['seq'] = "";
  1054. ndata.doc['projectID'] = projectObj.project.ID();
  1055. ndata.doc['code'] = "";
  1056. ndata.doc['name'] = "";
  1057. ndata.doc['unit'] = "";
  1058. ndata.doc['originPlace'] = "";
  1059. ndata.doc['vender'] = "";
  1060. ndata.doc['remark'] = "";
  1061. configMaterialObj.updateEvaluateMaterial([ndata], false);
  1062. },
  1063. initRightClick: function () {
  1064. let me = this;
  1065. $.contextMenu({
  1066. selector: '#config_material_sheet',
  1067. build: function ($trigger, e) {
  1068. me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, me.configSpread);
  1069. return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport ||
  1070. me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
  1071. },
  1072. items: {
  1073. "addFromGLJ": {
  1074. name: '从人材机汇总中选择',
  1075. icon: 'fa-sign-in',
  1076. disabled: function () {
  1077. return false;
  1078. },
  1079. callback: function (key, opt) {
  1080. if (projectGljObject.displayType == filterType.AMAE) {
  1081. materialAdjustObj.checkedDefualtOption("glj_sel_input");
  1082. $("#selectFromGLJ").modal('show');
  1083. } else {
  1084. // materialAdjustObj.checkedDefualtOption("pglj_sel_input"); 暂时没有这个
  1085. $("#selectPGLJ").modal('show');
  1086. }
  1087. }
  1088. },
  1089. "insertRow": {
  1090. name: '插入',
  1091. icon: 'fa-sign-in',
  1092. disabled: function () {
  1093. return false;
  1094. },
  1095. callback: function (key, opt) {
  1096. if (projectGljObject.displayType == filterType.AMAE) {
  1097. materialAdjustObj.insertEmptyRow();
  1098. } else {
  1099. configMaterialObj.insertEmptyRow();
  1100. }
  1101. }
  1102. },
  1103. "deleteAdjust": {
  1104. name: "删除",
  1105. icon: 'fa-trash-o',
  1106. disabled: function () {
  1107. return me.rightClickTarget.row === undefined;
  1108. },
  1109. callback: function (key, opt) {
  1110. let row = me.rightClickTarget.row;
  1111. me.deleteMaterial(row);
  1112. }
  1113. }
  1114. }
  1115. });
  1116. }
  1117. };
  1118. let pgljSelObj = {
  1119. spread: null,
  1120. sheet: null,
  1121. datas: [],
  1122. setting: {
  1123. header: [{
  1124. headerName: "选择",
  1125. headerWidth: 45,
  1126. dataCode: "select",
  1127. hAlign: "center",
  1128. dataType: "String",
  1129. cellType: 'checkBox'
  1130. },
  1131. {
  1132. headerName: "编码",
  1133. headerWidth: 80,
  1134. dataCode: "code",
  1135. dataType: "String"
  1136. },
  1137. {
  1138. headerName: "类型",
  1139. headerWidth: 30,
  1140. dataCode: "short_name",
  1141. hAlign: "center",
  1142. dataType: "String"
  1143. },
  1144. {
  1145. headerName: "名称",
  1146. headerWidth: 160,
  1147. dataCode: "name",
  1148. dataType: "String",
  1149. cellType: 'tipsCell'
  1150. },
  1151. {
  1152. headerName: "规格型号",
  1153. headerWidth: 100,
  1154. dataCode: "specs",
  1155. hAlign: "left",
  1156. dataType: "String",
  1157. cellType: 'tipsCell'
  1158. },
  1159. {
  1160. headerName: "单位",
  1161. headerWidth: 45,
  1162. dataCode: "unit",
  1163. hAlign: "center",
  1164. dataType: "String"
  1165. },
  1166. {
  1167. headerName: "总消耗量",
  1168. headerWidth: 90,
  1169. dataCode: "quantity",
  1170. hAlign: "right",
  1171. dataType: "Number",
  1172. decimalField: 'glj.quantity'
  1173. },
  1174. {
  1175. headerName: "市场价",
  1176. headerWidth: 70,
  1177. dataCode: "marketPrice",
  1178. hAlign: "right",
  1179. dataType: "Number",
  1180. validator: "number"
  1181. }, //,decimalField:"glj.unitPrice"
  1182. {
  1183. headerName: "供货方式",
  1184. headerWidth: 70,
  1185. dataCode: "supply",
  1186. hAlign: "center",
  1187. dataType: "String",
  1188. cellType: 'comboBox',
  1189. editorValueType: true,
  1190. options: supplyComboMap
  1191. },
  1192. {
  1193. headerName: "暂估",
  1194. headerWidth: 45,
  1195. dataCode: "is_evaluate",
  1196. hAlign: "center",
  1197. dataType: "String",
  1198. cellType: 'checkBox'
  1199. },
  1200. /* {
  1201. headerName: "产地",
  1202. headerWidth: 80,
  1203. dataCode: "originPlace",
  1204. hAlign: "left",
  1205. dataType: "String"
  1206. },
  1207. {
  1208. headerName: "厂家",
  1209. headerWidth: 80,
  1210. dataCode: "vender",
  1211. hAlign: "left",
  1212. dataType: "String"
  1213. }, */
  1214. {
  1215. headerName: "备注",
  1216. headerWidth: 100,
  1217. dataCode: "remark",
  1218. hAlign: "left",
  1219. dataType: "String"
  1220. }
  1221. ],
  1222. view: {
  1223. lockColumns: ["is_evaluate"]
  1224. }
  1225. },
  1226. checkType: "取消", //记住点击过的按钮的text
  1227. initSpread: function () {
  1228. if (!this.spread) {
  1229. this.spread = SheetDataHelper.createNewSpread($("#pglj_from_sheet")[0]);
  1230. sheetCommonObj.spreadDefaultStyle(this.spread);
  1231. } else {
  1232. this.spread.refresh();
  1233. }
  1234. this.sheet = this.spread.getSheet(0);
  1235. sheetCommonObj.initSheet(this.sheet, this.setting);
  1236. this.sheet.bind(GC.Spread.Sheets.Events.EditStarting, this.onEditStarting);
  1237. this.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, this.onClipboardPasting);
  1238. this.sheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onValueChanged);
  1239. this.sheet.setRowHeight(0, 36, 1);
  1240. disableRightMenu("pglj_from_sheet", this.spread);
  1241. },
  1242. onEditStarting: function (e, args) {
  1243. args.cancel = true;
  1244. },
  1245. onClipboardPasting: function (e, args) {
  1246. args.cancel = true;
  1247. },
  1248. onValueChanged: function (e, args) {
  1249. let me = pgljSelObj;
  1250. let value = args.newValue;
  1251. value = value == true ? 1 : 0;
  1252. me.datas[args.row].select = value;
  1253. },
  1254. showDatas: function () {
  1255. this.datas = [];
  1256. let gljList = projectObj.project.projectGLJ.datas.gljList;
  1257. gljList = this.filterGLJ(gljList);
  1258. gljList = sortProjectGLJ(gljList);
  1259. for (let glj of gljList) {
  1260. this.datas.push(this.getSheetDatas(glj));
  1261. }
  1262. this.refreshDatas();
  1263. },
  1264. filterGLJ: function (gljList) {
  1265. let typeMap = {};
  1266. for (let ch of $(".pglj_sel_input:checked")) {
  1267. typeMap[$(ch).val()] = true;
  1268. }
  1269. let inputV = $("#pglj_sel_input").val();
  1270. return _.filter(gljList, function (item) {
  1271. if (item.quantity === 0 || item.quantity === '0') return false;
  1272. let firstS = (item.type + "").substring(0, 1);
  1273. if (!typeMap[firstS]) return false;
  1274. if (inputV != "") { //输入的关键字过滤
  1275. if (item.code.indexOf(inputV) == -1 && item.name.indexOf(inputV) == -1) return false
  1276. }
  1277. return true;
  1278. });
  1279. },
  1280. refreshDatas: function () {
  1281. this.checkByType(this.checkType);
  1282. sheetCommonObj.showData(this.sheet, this.setting, this.datas);
  1283. this.sheet.setRowCount(this.datas.length);
  1284. },
  1285. getSheetDatas(glj) {
  1286. let projectGLJ = projectObj.project.projectGLJ;
  1287. let materialIdList = projectGLJ.datas.constData.materialIdList;
  1288. let data = this.getCommonObject(glj);
  1289. data.select = projectGljObject.displayType == filterType.ZGCL ? glj.is_evaluate : glj.is_eval_material;
  1290. if (!gljUtil.isDef(data.select)) data.select = 0;
  1291. data.from = glj;
  1292. data.short_name = projectGLJ.getShortNameByID(glj.type);
  1293. // 只有材料才显示是否暂估
  1294. // if (materialIdList.indexOf(glj.type) >= 0) data.is_evaluate = glj.is_evaluate;
  1295. data.is_eval_material = glj.is_eval_material;
  1296. data.is_evaluate = glj.is_evaluate;
  1297. return data;
  1298. },
  1299. getCommonObject: function (glj) {
  1300. let data = {
  1301. select: 0,
  1302. id: glj.id,
  1303. code: glj.code,
  1304. name: glj.name,
  1305. specs: glj.specs,
  1306. unit: glj.unit,
  1307. type: glj.type,
  1308. quantity: glj.quantity,
  1309. supply: glj.supply,
  1310. originPlace: glj.originPlace,
  1311. vender: glj.vender,
  1312. brand: glj.brand,
  1313. remark: glj.remark
  1314. };
  1315. gljOprObj.setGLJPrice(data, glj);
  1316. return data;
  1317. },
  1318. checkByType: function (type) {
  1319. for (let d of this.datas) {
  1320. d.select = 0;
  1321. switch (type) {
  1322. case "全选":
  1323. d.select = 1;
  1324. break;
  1325. case "全选主材":
  1326. if (d.type == 4) d.select = 1;
  1327. break;
  1328. case "全选设备":
  1329. if (d.type == 5) d.select = 1;
  1330. break;
  1331. case "取消":
  1332. d.select = projectGljObject.displayType == filterType.ZGCL ? d.is_evaluate : d.is_eval_material;
  1333. if (!gljUtil.isDef(d.select)) d.select = 0;
  1334. break;
  1335. }
  1336. }
  1337. //this.refreshDatas();
  1338. },
  1339. confirmSelect: function () {
  1340. let tasks = [];
  1341. let datas = [],
  1342. modelType = '',
  1343. field = '';
  1344. switch (projectGljObject.displayType) {
  1345. case filterType.ZGCL:
  1346. datas = projectObj.project.evaluate_list.datas;
  1347. field = "is_evaluate";
  1348. modelType = "evaluate_list";
  1349. break;
  1350. case filterType.PBCL:
  1351. datas = projectObj.project.bid_evaluation_list.datas;
  1352. field = "is_eval_material";
  1353. modelType = "bid_evaluation_list";
  1354. break;
  1355. }
  1356. let evaluateMap = _.indexBy(datas, "projectGLJID");
  1357. let evaluateKeyMap = {}; //关键字映射表
  1358. for (let e of datas) {
  1359. let eIndex = gljUtil.getIndex(e, gljUtil.materialKeyArray);
  1360. evaluateKeyMap[eIndex] = e;
  1361. }
  1362. for (let d of this.datas) {
  1363. if (d.select == 1) { //如果是选中状态
  1364. if (d[field] == 1) { //如果已经标记为暂估或评标材料,查看是否已经存在关联的材料
  1365. let evl = evaluateMap[d.id];
  1366. if (evl) {
  1367. //这里应该是错误检查的保证,按正常是不应该出现这种情况的
  1368. if (evl.is_related != 1) tasks.push({
  1369. type: modelType,
  1370. doc: {
  1371. projectGLJID: d.id,
  1372. is_related: 1
  1373. },
  1374. action: "update",
  1375. ID: evl.ID
  1376. });
  1377. } else {
  1378. tasks.push(getNewEval(d, modelType))
  1379. }
  1380. } else { //如果不是暂估,要改成暂估
  1381. let pdata = {
  1382. id: d.id,
  1383. doc: {},
  1384. action: 'update',
  1385. type: "glj_list"
  1386. };
  1387. pdata.doc[field] = 1;
  1388. tasks.push(pdata);
  1389. let evaluate = evaluateKeyMap[gljUtil.getIndex(d, gljUtil.materialKeyArray)];
  1390. if (evaluate) { //如果已经存在5个关键字相同的暂估材料,则自动关联起来
  1391. let edata = {
  1392. type: modelType,
  1393. doc: {
  1394. projectGLJID: d.id,
  1395. is_related: 1
  1396. },
  1397. action: "update",
  1398. ID: evaluate.ID
  1399. };
  1400. tasks.push(edata);
  1401. if (modelType == 'evaluate_list') {
  1402. let udata = {
  1403. type: 'unit_price',
  1404. doc: {},
  1405. action: "update",
  1406. projectGLJID: d.id,
  1407. id: d.from.unit_price.id
  1408. };
  1409. if (evaluate.market_price != d.from.unit_price.market_price) udata.doc['market_price'] = evaluate.market_price;
  1410. if (!_.isEmpty(udata.doc)) tasks.push(udata);
  1411. }
  1412. } else { //如果不存在,则生成一条新的
  1413. tasks.push(getNewEval(d, modelType));
  1414. }
  1415. }
  1416. } else { //未选中状态的,检查一下是否存在关联的情况,取消关联
  1417. let tdoc = {};
  1418. tdoc[field] = 0;
  1419. if (d[field] == 1) tasks.push({
  1420. id: d.id,
  1421. doc: tdoc,
  1422. action: 'update',
  1423. type: "glj_list"
  1424. });
  1425. let evl = evaluateMap[d.id];
  1426. if (evl) {
  1427. if (evl.is_related == 1) tasks.push({
  1428. type: modelType,
  1429. doc: {
  1430. is_related: 0
  1431. },
  1432. action: "update",
  1433. ID: evl.ID
  1434. });
  1435. }
  1436. let evaluate = evaluateKeyMap[gljUtil.getIndex(d, gljUtil.materialKeyArray)];
  1437. if (evaluate) {
  1438. if (evaluate.is_related == 1) tasks.push({
  1439. type: modelType,
  1440. doc: {
  1441. is_related: 0
  1442. },
  1443. action: "update",
  1444. ID: evaluate.ID
  1445. });
  1446. }
  1447. }
  1448. }
  1449. if (tasks.length > 0) configMaterialObj.updateEvaluateMaterial(tasks);
  1450. function getNewEval(d, m_t) {
  1451. let ndata = {
  1452. type: m_t,
  1453. doc: {},
  1454. action: "add"
  1455. };
  1456. ndata.doc['ID'] = uuid.v1();
  1457. ndata.doc['projectGLJID'] = d.id;
  1458. ndata.doc['is_related'] = 1;
  1459. if (m_t == "evaluate_list") ndata.doc['locked'] = 0;
  1460. ndata.doc['seq'] = d.code;
  1461. ndata.doc['projectID'] = d.from.project_id;
  1462. ndata.doc['code'] = d.code;
  1463. ndata.doc['name'] = d.name;
  1464. ndata.doc['specs'] = d.specs;
  1465. ndata.doc['unit'] = d.unit;
  1466. ndata.doc['quantity'] = d.quantity;
  1467. ndata.doc['type'] = d.type;
  1468. ndata.doc['market_price'] = d.from.unit_price.market_price;
  1469. ndata.doc['originPlace'] = d.originPlace;
  1470. ndata.doc['vender'] = d.vender;
  1471. ndata.doc['remark'] = d.remark;
  1472. return ndata;
  1473. }
  1474. }
  1475. };
  1476. $(function () {
  1477. $("#filterAgain").click(function () {
  1478. configMaterialObj.relateFilterAgain = true; //重新过滤标记
  1479. configMaterialObj.showEvaluateRelateDatas();
  1480. })
  1481. $('#selectPGLJ').on('shown.bs.modal', function (e) {
  1482. pgljSelObj.checkType = "取消";
  1483. pgljSelObj.initSpread();
  1484. pgljSelObj.showDatas();
  1485. });
  1486. $(".pglj_sel_input").change(function () {
  1487. let check = $(this).prop("checked");
  1488. if ($(this).val() == 0) { //勾选的是全选,其它的勾选项跟着改变
  1489. for (let a of $(".pglj_sel_input")) {
  1490. $(a).prop("checked", check)
  1491. }
  1492. } else { //勾选其它选项
  1493. let a_checked = true;
  1494. for (let o of $(".pglj_sel_input_other")) { //如果其它的有一个不勾选,则所有项也不打勾
  1495. if ($(o).prop("checked") === false) {
  1496. a_checked = false;
  1497. break;
  1498. }
  1499. }
  1500. $("#pglj_sel_all").prop("checked", a_checked);
  1501. }
  1502. pgljSelObj.showDatas();
  1503. });
  1504. $("#pglj_sel_btn_find").click(function () {
  1505. pgljSelObj.showDatas();
  1506. });
  1507. $(".pglj_sel_check_btn").click(function () {
  1508. pgljSelObj.checkType = $(this).text();
  1509. pgljSelObj.refreshDatas();
  1510. })
  1511. $("#pglj_sel_confirm").click(function () {
  1512. pgljSelObj.confirmSelect();
  1513. })
  1514. });