material_replace_edit.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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",formatter: "@"},
  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.billsSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onBillsRangeChange);
  44. this.initRightClick("billsSpread",this.billsSpread);
  45. this.materialSheet = this.materialSpread .getSheet(0);
  46. sheetCommonObj.initSheet(this.materialSheet,this.materialSetting, 30);
  47. this.materialSheet.name('materialSheet');
  48. this.initRightClick("materialSpread",this.materialSpread);
  49. this.refreshSheet();
  50. },
  51. canDelete : function (sheet) {
  52. let me = this;
  53. let sel = sheet.getSelections()[0];
  54. let datas = sheet.name() == 'billsSheet'?me.billsList:me.materialList;
  55. if(sel.row === undefined || sel.row < 0) return false ;//一行都没选中时,不能删除
  56. if((sel.row + sel.rowCount) > datas.length) return false;//选中了空行,不能删除
  57. return true;
  58. },
  59. deleteBills : async function(sheet){
  60. let me = this,deleteList = [];
  61. let sel = sheet.getSelections()[0];
  62. for(let i = 0;i<sel.rowCount;i++){
  63. if(me.billsList[sel.row + i]) deleteList.push(getDeleteDatas(me.billsList[sel.row + i]));
  64. }
  65. if(deleteList.length > 0) await me.saveBills(deleteList);
  66. function getDeleteDatas(tem) {
  67. return {type:'delete', ID:tem.ID}
  68. }
  69. },
  70. initRightClick : function(id,spread) {
  71. let me = this;
  72. let sheet = spread.getActiveSheet();
  73. $.contextMenu({
  74. selector: '#'+id,
  75. build: function ($trigger, e) {
  76. me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, spread);
  77. return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport ||
  78. me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
  79. },
  80. items: {
  81. "delete": {
  82. name: "删除",
  83. icon: 'fa-trash-o',
  84. disabled: function () {
  85. return !me.canDelete(sheet);
  86. },
  87. callback: function (key, opt) {
  88. sheet.name() == 'billsSheet' ? me.deleteBills(sheet):"";
  89. console.log( me.rightClickTarget);
  90. }
  91. }
  92. }
  93. });
  94. },
  95. refreshSheet:function(){
  96. sheetCommonObj.showData(this.billsSheet,this.billsSetting,this.billsList);
  97. this.billsSheet.setRowCount(this.billsList.length + 30);
  98. },
  99. onBillsSelectionChange:function (sender,args) {
  100. args.sheet.repaint();
  101. },
  102. onBillsRangeChange:function (sender,args) {
  103. let me = materialOjb;
  104. let updateDatas = [];
  105. if(args.action == GC.Spread.Sheets.RangeChangedAction.paste){
  106. for(let c of args.changedCells){
  107. let field = me.billsSetting.header[c.col].dataCode;
  108. let newValue = args.sheet.getCell(c.row,c.col).value();
  109. if(me.validateBills(field,newValue)){
  110. if(c.row < me.billsList.length){
  111. let data = me.getUpdateData(field,newValue,me.billsList[c.row].code);
  112. if(data) updateDatas.push(data);
  113. }else if(field == 'code'){//如果是在空白行粘贴,并且是编码列,则是新增,其它的忽略;
  114. let data = me.getUpdateData(field,newValue,null);
  115. if(data) updateDatas.push(data);
  116. }
  117. }else {
  118. break;
  119. }
  120. }
  121. if(updateDatas.length > 0){
  122. me.saveBills(updateDatas);
  123. return;
  124. }
  125. }
  126. me.refreshSheet();
  127. },
  128. onBillsValueChange: function(sander,args){
  129. let me = materialOjb;
  130. let field = me.billsSetting.header[args.col].dataCode;
  131. let code = null;
  132. if(args.row < me.billsList.length){
  133. code = me.billsList[args.row].code;
  134. }
  135. if(me.validateBills(field,args.newValue)){
  136. let data = me.getUpdateData(field,args.newValue,code);
  137. if (data){
  138. me.saveBills([data]);
  139. return;
  140. }
  141. }
  142. me.refreshSheet();
  143. },
  144. validateBills:function (field,value) {
  145. if(field == 'code'){
  146. value = value.toString().replace(/[\s\r\n]/g, "");//去除空格换行等字符;
  147. if(value.length !== 9){
  148. alert("清单长度不正确");
  149. return false;
  150. }
  151. if(_.find(this.billsList,{'code':value})) {
  152. alert("清单:"+value+" 已存在");
  153. return false;
  154. }
  155. }
  156. return true;
  157. },
  158. getUpdateData:function (field,newValue,code) {
  159. if(field == 'code'){
  160. newValue = newValue.toString().replace(/[\s\r\n]/g, "");//去除空格换行等字符;
  161. if(!isDef(code) || code ==''&&newValue!=null){//说明是新增
  162. return {
  163. type:'add',
  164. code:newValue,
  165. libID:$('#libID').val(),
  166. billsLibId:parseInt($('#billsLibId').val())
  167. }
  168. }else {//说明是替换
  169. return {
  170. type:'update',
  171. oldCode:code.toString(),
  172. newCode:newValue,
  173. libID:$('#libID').val(),
  174. billsLibId:parseInt($('#billsLibId').val())
  175. }
  176. }
  177. }else if(isDef(code)){
  178. let updateData = {};
  179. updateData[field] = newValue;
  180. return {
  181. type:'update',
  182. oldCode:code.toString(),
  183. libID:$('#libID').val(),
  184. updateData:updateData
  185. }
  186. }
  187. },
  188. saveBills:async function (datas) {
  189. try {
  190. let result = await ajaxPost("/materialReplace/saveBills",datas);
  191. let missCodes = [];
  192. for(let r of result){
  193. if(r.missCodes && r.missCodes.length >0) missCodes =missCodes.concat(r.missCodes);
  194. if(r.type == 'add'){
  195. this.billsList = this.billsList.concat(r.list);
  196. }if(r.type == 'update'){
  197. for(let l of r.list){
  198. this.updateCache(l.code,l.updateData)
  199. }
  200. }if(r.type == 'delete'){
  201. _.remove(this.billsList,function (item) {
  202. return _.includes(r.list,item.ID)
  203. })
  204. }
  205. }
  206. if(missCodes.length > 0) alert(`没有找到清单:${missCodes.join("、")}`);
  207. this.refreshSheet();
  208. }catch (err){
  209. console.log(err);
  210. }
  211. },
  212. updateCache:function (code,updateData) {
  213. let bill = _.find(this.billsList,{'code':code});
  214. for(let key in updateData){
  215. bill[key] = updateData[key]
  216. }
  217. }
  218. };
  219. function isDef(obj) {
  220. return obj!==undefined && obj!==null;
  221. }
  222. materialOjb.initSpread();