material_replace_edit_新编辑版本.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. /**
  2. * Created by zhang on 2018/8/23.
  3. */
  4. let materialOjb = {
  5. billsSpread:null,
  6. materialSpread:null,
  7. allBills:JSON.parse(billsList),
  8. billsList:JSON.parse(billsList),
  9. stdBills:JSON.parse($("#testStd").val()),
  10. materialList:[],
  11. billsTreeSetting: {
  12. treeCol: 0,
  13. emptyRows: 0,
  14. headRows: 1,
  15. headRowHeight: [40],
  16. defaultRowHeight: 21,
  17. cols: [{
  18. width: 200,
  19. readOnly: true,
  20. head: {
  21. titleNames: ["项目编码"],
  22. spanCols: [1],
  23. spanRows: [1],
  24. vAlign: [1],
  25. hAlign: [1],
  26. font: ["Arial"]
  27. },
  28. data: {
  29. field: "code",
  30. vAlign: 1,
  31. hAlign: 0,
  32. font: "Arial"
  33. }
  34. }, {
  35. width: 200,
  36. readOnly: true,
  37. head: {
  38. titleNames: ["项目名称"],
  39. spanCols: [1],
  40. spanRows: [1],
  41. vAlign: [1],
  42. hAlign: [1],
  43. font: ["Arial"]
  44. },
  45. data: {
  46. field: "name",
  47. vAlign: 1,
  48. hAlign: 0,
  49. font: "Arial"
  50. }
  51. }]
  52. },
  53. /* billsSetting:{
  54. header: [
  55. {headerName: "清单编号", headerWidth: 180, dataCode: "code", dataType: "String",formatter: "@"},
  56. {headerName: "清单名称", headerWidth: 240, dataCode: "name", dataType: "String"},
  57. {headerName: "规则", headerWidth: 150, dataCode: "rule", hAlign: "left", dataType: "String",cellType:'comboBox',editorValueType:true,options:[{text:"规则1",value:1},{text:"规则2",value:2}]}
  58. ],
  59. view: {
  60. lockColumns: [1]
  61. },
  62. headerHeight:45
  63. },*/
  64. materialSetting:{
  65. header: [
  66. {headerName: "材料编号", headerWidth: 180, dataCode: "code", dataType: "String",formatter: "@"},
  67. {headerName: "材料名称", headerWidth: 240, dataCode: "name", dataType: "String",cellType:'tipsCell'},
  68. {headerName: "规格", headerWidth: 150, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'}
  69. ],
  70. view: {
  71. lockColumns: [1,2]
  72. },
  73. headerHeight:45
  74. },
  75. initSpread:function () {
  76. /* if(!this.billsSpread){
  77. this.billsSpread = SheetDataHelper.createNewSpread($("#billsSpread")[0]);
  78. }
  79. if(!this.materialSpread){
  80. this.materialSpread = SheetDataHelper.createNewSpread($("#materialSpread")[0]);
  81. }
  82. this.billsSheet = this.billsSpread .getSheet(0);
  83. sheetCommonObj.initSheet(this.billsSheet,this.billsSetting, 30);
  84. this.billsSheet.name('billsSheet');
  85. this.billsSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onBillsValueChange);
  86. this.billsSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onBillsSelectionChange);
  87. this.billsSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onBillsRangeChange);
  88. this.initRightClick("billsSpread",this.billsSpread);
  89. this.materialSheet = this.materialSpread .getSheet(0);
  90. sheetCommonObj.initSheet(this.materialSheet,this.materialSetting, 30);
  91. this.materialSheet.name('materialSheet');
  92. this.materialSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onMaterialValueChange);
  93. this.materialSheet.bind(GC.Spread.Sheets.Events.EditStarting, this.onMaterialEditStarting);
  94. this.materialSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onMaterialRangeChange);
  95. this.initRightClick("materialSpread",this.materialSpread);
  96. this.refreshSheet();*/
  97. },
  98. canDelete : function (sheet) {
  99. let me = this;
  100. let sel = sheet.getSelections()[0];
  101. let datas = sheet.name() == 'billsSheet'?me.billsList:me.materialList;
  102. if(sel.row === undefined || sel.row < 0) return false ;//一行都没选中时,不能删除
  103. if((sel.row + sel.rowCount) > datas.length) return false;//选中了空行,不能删除
  104. return true;
  105. },
  106. deleteBills : async function(sheet){
  107. let me = this,deleteList = [];
  108. let sel = sheet.getSelections()[0];
  109. for(let i = 0;i<sel.rowCount;i++){
  110. if(me.billsList[sel.row + i]) deleteList.push(getDeleteDatas(me.billsList[sel.row + i]));
  111. }
  112. if(deleteList.length > 0) await me.saveBills(deleteList);
  113. function getDeleteDatas(tem) {
  114. return {type:'delete', ID:tem.ID}
  115. }
  116. },
  117. deleteMaterial:async function(sheet){
  118. let me = this,deleteList = [];
  119. let sel = sheet.getSelections()[0];
  120. for(let i = 0; i<sel.rowCount;i++){
  121. if(me.materialList[sel.row + i]) deleteList.push(me.getMaterialUpdateData(null,me.materialList[sel.row + i].ID,true));
  122. }
  123. if(deleteList.length > 0) await me.saveMaterial(deleteList);
  124. },
  125. initRightClick : function(id,spread) {
  126. let me = this;
  127. let sheet = spread.getActiveSheet();
  128. $.contextMenu({
  129. selector: '#'+id,
  130. build: function ($trigger, e) {
  131. me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, spread);
  132. return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport ||
  133. me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
  134. },
  135. items: {
  136. "delete": {
  137. name: "删除",
  138. icon: 'fa-trash-o',
  139. disabled: function () {
  140. return !me.canDelete(sheet);
  141. },
  142. callback: function (key, opt) {
  143. sheet.name() == 'billsSheet' ? me.deleteBills(sheet):me.deleteMaterial(sheet);
  144. console.log( me.rightClickTarget);
  145. }
  146. }
  147. }
  148. });
  149. },
  150. refreshSheet:async function(){
  151. this.getBillsList();
  152. sheetCommonObj.showData(this.billsSheet,this.billsSetting,this.billsList);
  153. this.billsSheet.setRowCount(this.billsList.length + 30);
  154. this.showMaterialList();
  155. },
  156. getBillsList:function () {
  157. let keyword = $("#keyword").val();
  158. if(isDef(keyword)&&keyword!==''){
  159. this.billsList = _.filter(this.allBills,function (item) {
  160. return item.code.indexOf(keyword)!=-1 || item.name.indexOf(keyword)!=-1;
  161. })
  162. }else {
  163. this.billsList = this.allBills;
  164. }
  165. this.billsList = _.sortBy(this.billsList,'code');
  166. },
  167. getMateriaList:async function () {
  168. let billsItemID = this.getCurrentBillsID();
  169. if(billsItemID){
  170. this.materialList = await this.getMaterialByBillsID(billsItemID)//getMaterialByBills
  171. }else {
  172. this.materialList = [];
  173. }
  174. },
  175. showMaterialList:async function () {
  176. await this.getMateriaList();
  177. this.refreshMaterialSheet();
  178. },
  179. refreshMaterialSheet:function () {
  180. this.materialList = _.sortBy(this.materialList,'code');
  181. sheetCommonObj.showData(this.materialSheet,this.materialSetting,this.materialList);
  182. this.materialSheet.setRowCount(this.materialList.length + 30);
  183. },
  184. onBillsSelectionChange:function (sender,args) {
  185. let me = materialOjb;
  186. let nsel = args.newSelections?args.newSelections[0]:null;
  187. let osel = args.oldSelections?args.oldSelections[0]:null;
  188. if(nsel && osel && nsel.row != osel.row){
  189. me.showMaterialList();
  190. me.materialSheet.showRow(0, GC.Spread.Sheets.VerticalPosition.top);
  191. }
  192. args.sheet.repaint();
  193. },
  194. onBillsRangeChange:function (sender,args) {
  195. let me = materialOjb;
  196. let updateDatas = [];
  197. if(args.action == GC.Spread.Sheets.RangeChangedAction.paste){
  198. for(let c of args.changedCells){
  199. let field = me.billsSetting.header[c.col].dataCode;
  200. let newValue = args.sheet.getCell(c.row,c.col).value();
  201. let data = null;
  202. if(me.validateBills(field,newValue)){
  203. if(c.row < me.billsList.length){
  204. data = me.getUpdateData(field,newValue,me.billsList[c.row].code);
  205. }else if(field == 'code'){//如果是在空白行粘贴,并且是编码列,则是新增,其它的忽略;
  206. data = me.getUpdateData(field,newValue,null);
  207. }
  208. if(data) updateDatas.push(data);
  209. }else {
  210. break;
  211. }
  212. }
  213. if(updateDatas.length > 0){
  214. me.saveBills(updateDatas);
  215. return;
  216. }
  217. }
  218. me.refreshSheet();
  219. },
  220. onMaterialRangeChange:function(sender,args){
  221. let me = materialOjb;
  222. let updateDatas = [];
  223. if(args.action == GC.Spread.Sheets.RangeChangedAction.paste){
  224. for(let c of args.changedCells){
  225. let code = args.sheet.getCell(c.row,c.col).value(),data = null;
  226. if(me.validateMaterial(code)){
  227. if(c.row < me.materialList.length){
  228. data = me.getMaterialUpdateData(code,me.materialList[c.row].ID);
  229. }else {//如果是在空白行粘贴,并且是编码列,则是新增,其它的忽略;
  230. data = me.getMaterialUpdateData(code,null);
  231. }
  232. if(data) updateDatas.push(data);
  233. }else {
  234. break;
  235. }
  236. }
  237. if(updateDatas.length > 0){
  238. me.saveMaterial(updateDatas);
  239. return;
  240. }
  241. }
  242. me.showMaterialList();
  243. },
  244. onBillsValueChange: function(sender,args){
  245. let me = materialOjb;
  246. let field = me.billsSetting.header[args.col].dataCode;
  247. let code = null;
  248. if(args.row < me.billsList.length){
  249. code = me.billsList[args.row].code;
  250. }
  251. if(me.validateBills(field,args.newValue)){
  252. let data = me.getUpdateData(field,args.newValue,code);
  253. if (data){
  254. me.saveBills([data]);
  255. return;
  256. }
  257. }
  258. me.refreshSheet();
  259. },
  260. onMaterialEditStarting : function (sender,args) {
  261. let me = materialOjb;
  262. if(!me.getCurrentBillsID()) args.cancel = true; //如果没选中清单则不能编辑
  263. },
  264. onMaterialValueChange:function(sender,args){
  265. let me = materialOjb;
  266. let ID = null;
  267. if(args.row < me.materialList.length){
  268. ID = me.materialList[args.row].ID;
  269. }
  270. if(me.validateMaterial(args.newValue)){
  271. let data = me.getMaterialUpdateData(args.newValue,ID);
  272. if(data){
  273. me.saveMaterial([data]);
  274. return
  275. }
  276. }
  277. me.showMaterialList();
  278. },
  279. validateMaterial:function (value) {
  280. value = value.toString().replace(/[\s\r\n]/g, "");//去除空格换行等字符;
  281. if(_.find(this.materialList,{code:value})){
  282. alert("人材机:"+value+" 已存在");
  283. return false;
  284. }
  285. return true;
  286. },
  287. validateBills:function (field,value) {
  288. if(field == 'code'){
  289. value = value.toString().replace(/[\s\r\n]/g, "");//去除空格换行等字符;
  290. if(value.length !== 9){
  291. alert("清单长度不正确");
  292. return false;
  293. }
  294. if(_.find(this.billsList,{'code':value})) {
  295. alert("清单:"+value+" 已存在");
  296. return false;
  297. }
  298. }
  299. return true;
  300. },
  301. getCurrentBillsID:function(){
  302. let sel = this.billsSheet.getSelections()[0];
  303. if(sel.row < this.billsList.length){
  304. return this.billsList[sel.row].ID;
  305. }
  306. return null;
  307. },
  308. getMaterialUpdateData:function(code,ID,isDelete){
  309. if(isDelete == true){
  310. return {type:'delete', ID:ID}
  311. }
  312. code = code.toString().replace(/[\s\r\n]/g, "");//去除空格换行等字符;
  313. if((!isDef(ID)||ID=='')&& code != null){//新增
  314. let billsItemID = this.getCurrentBillsID();
  315. return {
  316. type:'add',
  317. code:code,
  318. billsItemID:billsItemID,
  319. libID:$('#libID').val(),
  320. gljLibID:parseInt($('#gljLibID').val())
  321. }
  322. }else { //替换材料
  323. return {
  324. type:'update',
  325. ID:ID,
  326. code:code,
  327. gljLibID:parseInt($('#gljLibID').val())
  328. }
  329. }
  330. },
  331. getUpdateData:function (field,newValue,code) {
  332. if(field == 'code'){
  333. newValue = newValue.toString().replace(/[\s\r\n]/g, "");//去除空格换行等字符;
  334. if((!isDef(code) || code =='')&&newValue!=null){//说明是新增
  335. return {
  336. type:'add',
  337. code:newValue,
  338. libID:$('#libID').val(),
  339. billsLibId:parseInt($('#billsLibId').val())
  340. }
  341. }else {//说明是替换
  342. return {
  343. type:'update',
  344. oldCode:code.toString(),
  345. newCode:newValue,
  346. libID:$('#libID').val(),
  347. billsLibId:parseInt($('#billsLibId').val())
  348. }
  349. }
  350. }else if(isDef(code)){
  351. let updateData = {};
  352. updateData[field] = newValue;
  353. return {
  354. type:'update',
  355. oldCode:code.toString(),
  356. libID:$('#libID').val(),
  357. updateData:updateData
  358. }
  359. }
  360. },
  361. saveMaterial:async function(datas){
  362. try {
  363. let result = await ajaxPost("/materialReplace/saveMaterial",datas);
  364. let missCodes = [];
  365. for(let r of result){
  366. if(r.missCodes && r.missCodes.length >0) missCodes =missCodes.concat(r.missCodes);
  367. }
  368. if(missCodes.length > 0) alert(`没有找到人材机:${missCodes.join("、")}`);
  369. }catch (err){
  370. console.log(err);
  371. }
  372. this.showMaterialList();
  373. },
  374. saveBills:async function (datas) {
  375. try {
  376. let result = await ajaxPost("/materialReplace/saveBills",datas);
  377. let missCodes = [];
  378. for(let r of result){
  379. if(r.missCodes && r.missCodes.length >0) missCodes =missCodes.concat(r.missCodes);
  380. if(r.type == 'add'){
  381. this.allBills = this.allBills.concat(r.list);
  382. }if(r.type == 'update'){
  383. for(let l of r.list){
  384. this.updateBillsCache(l.code,l.updateData);
  385. }
  386. }if(r.type == 'delete'){
  387. _.remove(this.allBills,function (item) {
  388. return _.includes(r.list,item.ID)
  389. })
  390. }
  391. }
  392. if(missCodes.length > 0) alert(`没有找到清单:${missCodes.join("、")}`);
  393. }catch (err){
  394. console.log(err);
  395. }
  396. this.refreshSheet();
  397. },
  398. saveDatas:async function (datas,type ='bills') {
  399. try {
  400. let currentList = type =='bills'?this.billsList:this.materialList;
  401. let url = type =='bills'?"/materialReplace/saveBills":"/materialReplace/saveMaterial";
  402. let text = type =='bills'?"清单":"人材机";
  403. let result = await ajaxPost(url,datas);
  404. let missCodes = [];
  405. for(let r of result){
  406. if(r.missCodes && r.missCodes.length >0) missCodes =missCodes.concat(r.missCodes);
  407. if(r.type == 'add'){
  408. currentList = currentList.concat(r.list);
  409. }if(r.type == 'update'){
  410. for(let l of r.list){
  411. type =='bills'?this.updateBillsCache(l.code,l.updateData):this.updateMaterialCache(l.ID,l.updateData);
  412. }
  413. }if(r.type == 'delete'){
  414. _.remove(currentList,function (item) {
  415. return _.includes(r.list,item.ID)
  416. })
  417. }
  418. }
  419. if(missCodes.length > 0) alert(`没有找到${text}:${missCodes.join("、")}`);
  420. }catch (err){
  421. console.log(err);
  422. }
  423. },
  424. getMaterialByBillsID:async function(billsItemID){
  425. try {
  426. let result = await ajaxPost("/materialReplace/findMaterial",{billsItemID:billsItemID});
  427. return result;
  428. }catch (err){
  429. console.log(err);
  430. return [];
  431. }
  432. },
  433. updateMaterialCache:function (ID,updateData) {
  434. this.updateCache(this.materialList,{'ID':ID},updateData)
  435. },
  436. updateBillsCache:function (code,updateData) {
  437. this.updateCache(this.allBills,{'code':code},updateData)
  438. },
  439. updateCache:function (list,condition,updateData) {
  440. let item = _.find(list,condition);
  441. for(let key in updateData){
  442. item[key] = updateData[key]
  443. }
  444. }
  445. };
  446. let last = 0;
  447. $(document).ready(function () {
  448. $("#keyword").on('input propertychange', function(event) {
  449. last = event.timeStamp;//利用event的timeStamp来标记时间,这样每次事件都会修改last的值,注意last必需为全局变量
  450. setTimeout(function () { //设时延迟0.5s执行
  451. if (last - event.timeStamp == 0) { //如果时间差为0(也就是你停止输入0.5s之内都没有其它的keyup事件发生)则做你想要做的事
  452. materialOjb.refreshSheet();
  453. }
  454. }, 500);
  455. })
  456. });
  457. function isDef(obj) {
  458. return obj!==undefined && obj!==null;
  459. }
  460. materialOjb.initSpread();