material_replace_edit.js 17 KB

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