material_replace_edit.js 17 KB

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