material_replace_edit.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /**
  2. * Created by zhang on 2018/8/23.
  3. */
  4. let materialOjb = {
  5. billsSpread:null,
  6. materialSpread:null,
  7. billsList:JSON.parse(billsList),
  8. materialList:[],
  9. billsSetting:{
  10. header: [
  11. {headerName: "清单编号", headerWidth: 180, dataCode: "code", dataType: "String",formatter: "@"},
  12. {headerName: "清单名称", headerWidth: 240, dataCode: "name", dataType: "String"},
  13. {headerName: "规则", headerWidth: 150, dataCode: "rule", hAlign: "left", dataType: "String",cellType:'comboBox',editorValueType:true,options:[{text:"规则1",value:1},{text:"规则2",value:2}]}
  14. ],
  15. view: {
  16. lockColumns: [1]
  17. },
  18. headerHeight:45
  19. },
  20. materialSetting:{
  21. header: [
  22. {headerName: "材料编号", headerWidth: 180, dataCode: "code", dataType: "String"},
  23. {headerName: "材料名称", headerWidth: 240, dataCode: "name", dataType: "String",cellType:'tipsCell'},
  24. {headerName: "规格", headerWidth: 150, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'}
  25. ],
  26. view: {
  27. lockColumns: [1,2]
  28. },
  29. headerHeight:45
  30. },
  31. initSpread:function () {
  32. if(!this.billsSpread){
  33. this.billsSpread = SheetDataHelper.createNewSpread($("#billsSpread")[0]);
  34. }
  35. if(!this.materialSpread){
  36. this.materialSpread = SheetDataHelper.createNewSpread($("#materialSpread")[0]);
  37. }
  38. this.billsSheet = this.billsSpread .getSheet(0);
  39. sheetCommonObj.initSheet(this.billsSheet,this.billsSetting, 30);
  40. this.billsSheet.name('billsSheet');
  41. this.billsSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onBillsValueChange);
  42. this.billsSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onBillsSelectionChange);
  43. this.initRightClick("billsSpread",this.billsSpread);
  44. this.materialSheet = this.materialSpread .getSheet(0);
  45. sheetCommonObj.initSheet(this.materialSheet,this.materialSetting, 30);
  46. this.materialSheet.name('materialSheet');
  47. this.initRightClick("materialSpread",this.materialSpread);
  48. this.refreshSheet();
  49. },
  50. canDelete : function (sheet) {
  51. let me = this;
  52. let sel = sheet.getSelections()[0];
  53. let datas = sheet.name() == 'billsSheet'?me.billsList:me.materialList;
  54. if(sel.row === undefined || sel.row < 0) return false ;//一行都没选中时,不能删除
  55. if((sel.row + sel.rowCount) > datas.length) return false;//选中了空行,不能删除
  56. return true;
  57. },
  58. deleteBills : async function(sheet){
  59. let me = this,deleteList = [];
  60. let sel = sheet.getSelections()[0];
  61. for(let i = 0;i<sel.rowCount;i++){
  62. if(me.billsList[sel.row + i]) deleteList.push(getDeleteDatas(me.billsList[sel.row + i]));
  63. }
  64. if(deleteList.length > 0) await me.saveBills(deleteList);
  65. function getDeleteDatas(tem) {
  66. return {type:'delete', ID:tem.ID}
  67. }
  68. },
  69. initRightClick : function(id,spread) {
  70. let me = this;
  71. let sheet = spread.getActiveSheet();
  72. $.contextMenu({
  73. selector: '#'+id,
  74. build: function ($trigger, e) {
  75. me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, spread);
  76. return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport ||
  77. me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
  78. },
  79. items: {
  80. "delete": {
  81. name: "删除",
  82. icon: 'fa-trash-o',
  83. disabled: function () {
  84. return !me.canDelete(sheet);
  85. },
  86. callback: function (key, opt) {
  87. sheet.name() == 'billsSheet' ? me.deleteBills(sheet):"";
  88. console.log( me.rightClickTarget);
  89. }
  90. }
  91. }
  92. });
  93. },
  94. refreshSheet:function(){
  95. sheetCommonObj.showData(this.billsSheet,this.billsSetting,this.billsList);
  96. this.billsSheet.setRowCount(this.billsList.length + 1);
  97. },
  98. onBillsSelectionChange:function (sander,args) {
  99. args.sheet.repaint();
  100. },
  101. onBillsValueChange: function(sander,args){
  102. let me = materialOjb;
  103. let field = me.billsSetting.header[args.col].dataCode;
  104. let code = null;
  105. if(args.row < me.billsList.length){
  106. code = me.billsList[args.row].code;
  107. }
  108. if(me.validateBills(field,args.newValue)){
  109. let data = me.getUpdateData(field,args.newValue,code);
  110. if (data){
  111. me.saveBills([data]);
  112. return;
  113. }
  114. }
  115. me.refreshSheet();
  116. },
  117. validateBills:function (field,value) {
  118. if(field == 'code'){
  119. if(value.length !== 9){
  120. alert("清单长度不正确");
  121. return false;
  122. }
  123. if(_.find(this.billsList,{'code':value})) {
  124. alert("清单已存在");
  125. return false;
  126. }
  127. }
  128. return true;
  129. },
  130. getUpdateData:function (field,newValue,code) {
  131. if(field == 'code'){
  132. if(!isDef(code) || code ==''&&newValue!=null){//说明是新增
  133. return {
  134. type:'add',
  135. code:newValue.toString(),
  136. libID:$('#libID').val(),
  137. billsLibId:parseInt($('#billsLibId').val())
  138. }
  139. }else {//说明是替换
  140. return {
  141. type:'update',
  142. oldCode:code.toString(),
  143. newCode:newValue.toString(),
  144. libID:$('#libID').val(),
  145. billsLibId:parseInt($('#billsLibId').val())
  146. }
  147. }
  148. }else if(isDef(code)){
  149. let updateData = {};
  150. updateData[field] = newValue;
  151. return {
  152. type:'update',
  153. oldCode:code.toString(),
  154. libID:$('#libID').val(),
  155. updateData:updateData
  156. }
  157. }
  158. },
  159. saveBills:async function (datas) {
  160. try {
  161. let result = await ajaxPost("/materialReplace/saveBills",datas);
  162. let missCodes = [];
  163. for(let r of result){
  164. if(r.missCodes && r.missCodes.length >0) missCodes =missCodes.concat(r.missCodes);
  165. if(r.type == 'add'){
  166. this.billsList = this.billsList.concat(r.list);
  167. }if(r.type == 'update'){
  168. for(let l of r.list){
  169. this.updateCache(l.code,l.updateData)
  170. }
  171. }if(r.type == 'delete'){
  172. _.remove(this.billsList,function (item) {
  173. return _.includes(r.list,item.ID)
  174. })
  175. }
  176. }
  177. if(missCodes.length > 0) alert(`没有找到清单:${missCodes.join("、")}`);
  178. this.refreshSheet();
  179. }catch (err){
  180. console.log(err);
  181. }
  182. },
  183. updateCache:function (code,updateData) {
  184. let bill = _.find(this.billsList,{'code':code});
  185. for(let key of updateData){
  186. bill[key] = updateData[key]
  187. }
  188. }
  189. };
  190. function isDef(obj) {
  191. return obj!==undefined && obj!==null;
  192. }
  193. materialOjb.initSpread();