material_replace_edit.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  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. this.billsList = _.sortBy(this.billsList,'code');
  123. },
  124. getMateriaList:async function () {
  125. let billsItemID = this.getCurrentBillsID();
  126. if(billsItemID){
  127. this.materialList = await this.getMaterialByBillsID(billsItemID)//getMaterialByBills
  128. }else {
  129. this.materialList = [];
  130. }
  131. },
  132. showMaterialList:async function () {
  133. await this.getMateriaList();
  134. this.refreshMaterialSheet();
  135. },
  136. refreshMaterialSheet:function () {
  137. this.materialList = _.sortBy(this.materialList,'code');
  138. sheetCommonObj.showData(this.materialSheet,this.materialSetting,this.materialList);
  139. this.materialSheet.setRowCount(this.materialList.length + 30);
  140. },
  141. onBillsSelectionChange:function (sender,args) {
  142. let me = materialOjb;
  143. let nsel = args.newSelections?args.newSelections[0]:null;
  144. let osel = args.oldSelections?args.oldSelections[0]:null;
  145. if(nsel && osel && nsel.row != osel.row){
  146. me.showMaterialList();
  147. me.materialSheet.showRow(0, GC.Spread.Sheets.VerticalPosition.top);
  148. }
  149. args.sheet.repaint();
  150. },
  151. onBillsRangeChange:function (sender,args) {
  152. let me = materialOjb;
  153. let updateDatas = [];
  154. if(args.action == GC.Spread.Sheets.RangeChangedAction.paste){
  155. for(let c of args.changedCells){
  156. let field = me.billsSetting.header[c.col].dataCode;
  157. let newValue = args.sheet.getCell(c.row,c.col).value();
  158. let data = null;
  159. if(me.validateBills(field,newValue)){
  160. if(c.row < me.billsList.length){
  161. data = me.getUpdateData(field,newValue,me.billsList[c.row].code);
  162. }else if(field == 'code'){//如果是在空白行粘贴,并且是编码列,则是新增,其它的忽略;
  163. data = me.getUpdateData(field,newValue,null);
  164. }
  165. if(data) updateDatas.push(data);
  166. }else {
  167. break;
  168. }
  169. }
  170. if(updateDatas.length > 0){
  171. me.saveBills(updateDatas);
  172. return;
  173. }
  174. }
  175. me.refreshSheet();
  176. },
  177. onMaterialRangeChange:function(sender,args){
  178. let me = materialOjb;
  179. let updateDatas = [];
  180. if(args.action == GC.Spread.Sheets.RangeChangedAction.paste){
  181. for(let c of args.changedCells){
  182. let code = args.sheet.getCell(c.row,c.col).value(),data = null;
  183. if(me.validateMaterial(code)){
  184. if(c.row < me.materialList.length){
  185. data = me.getMaterialUpdateData(code,me.materialList[c.row].ID);
  186. }else {//如果是在空白行粘贴,并且是编码列,则是新增,其它的忽略;
  187. data = me.getMaterialUpdateData(code,null);
  188. }
  189. if(data) updateDatas.push(data);
  190. }else {
  191. break;
  192. }
  193. }
  194. if(updateDatas.length > 0){
  195. me.saveMaterial(updateDatas);
  196. return;
  197. }
  198. }
  199. me.showMaterialList();
  200. },
  201. onBillsValueChange: function(sender,args){
  202. let me = materialOjb;
  203. let field = me.billsSetting.header[args.col].dataCode;
  204. let code = null;
  205. if(args.row < me.billsList.length){
  206. code = me.billsList[args.row].code;
  207. }
  208. if(me.validateBills(field,args.newValue)){
  209. let data = me.getUpdateData(field,args.newValue,code);
  210. if (data){
  211. me.saveBills([data]);
  212. return;
  213. }
  214. }
  215. me.refreshSheet();
  216. },
  217. onMaterialEditStarting : function (sender,args) {
  218. let me = materialOjb;
  219. if(!me.getCurrentBillsID()) args.cancel = true; //如果没选中清单则不能编辑
  220. },
  221. onMaterialValueChange:function(sender,args){
  222. let me = materialOjb;
  223. let ID = null;
  224. if(args.row < me.materialList.length){
  225. ID = me.materialList[args.row].ID;
  226. }
  227. if(me.validateMaterial(args.newValue)){
  228. let data = me.getMaterialUpdateData(args.newValue,ID);
  229. if(data){
  230. me.saveMaterial([data]);
  231. return
  232. }
  233. }
  234. me.showMaterialList();
  235. },
  236. validateMaterial:function (value) {
  237. value = value.toString().replace(/[\s\r\n]/g, "");//去除空格换行等字符;
  238. if(_.find(this.materialList,{code:value})){
  239. alert("人材机:"+value+" 已存在");
  240. return false;
  241. }
  242. return true;
  243. },
  244. validateBills:function (field,value) {
  245. if(field == 'code'){
  246. value = value.toString().replace(/[\s\r\n]/g, "");//去除空格换行等字符;
  247. if(value.length !== 9){
  248. alert("清单长度不正确");
  249. return false;
  250. }
  251. if(_.find(this.billsList,{'code':value})) {
  252. alert("清单:"+value+" 已存在");
  253. return false;
  254. }
  255. }
  256. return true;
  257. },
  258. getCurrentBillsID:function(){
  259. let sel = this.billsSheet.getSelections()[0];
  260. if(sel.row < this.billsList.length){
  261. return this.billsList[sel.row].ID;
  262. }
  263. return null;
  264. },
  265. getMaterialUpdateData:function(code,ID,isDelete){
  266. if(isDelete == true){
  267. return {type:'delete', ID:ID}
  268. }
  269. code = code.toString().replace(/[\s\r\n]/g, "");//去除空格换行等字符;
  270. if((!isDef(ID)||ID=='')&& code != null){//新增
  271. let billsItemID = this.getCurrentBillsID();
  272. return {
  273. type:'add',
  274. code:code,
  275. billsItemID:billsItemID,
  276. libID:$('#libID').val(),
  277. gljLibID:parseInt($('#gljLibID').val())
  278. }
  279. }else { //替换材料
  280. return {
  281. type:'update',
  282. ID:ID,
  283. code:code,
  284. gljLibID:parseInt($('#gljLibID').val())
  285. }
  286. }
  287. },
  288. getUpdateData:function (field,newValue,code) {
  289. if(field == 'code'){
  290. newValue = newValue.toString().replace(/[\s\r\n]/g, "");//去除空格换行等字符;
  291. if((!isDef(code) || code =='')&&newValue!=null){//说明是新增
  292. return {
  293. type:'add',
  294. code:newValue,
  295. libID:$('#libID').val(),
  296. billsLibId:parseInt($('#billsLibId').val())
  297. }
  298. }else {//说明是替换
  299. return {
  300. type:'update',
  301. oldCode:code.toString(),
  302. newCode:newValue,
  303. libID:$('#libID').val(),
  304. billsLibId:parseInt($('#billsLibId').val())
  305. }
  306. }
  307. }else if(isDef(code)){
  308. let updateData = {};
  309. updateData[field] = newValue;
  310. return {
  311. type:'update',
  312. oldCode:code.toString(),
  313. libID:$('#libID').val(),
  314. updateData:updateData
  315. }
  316. }
  317. },
  318. saveMaterial:async function(datas){
  319. try {
  320. let result = await ajaxPost("/materialReplace/saveMaterial",datas);
  321. let missCodes = [];
  322. for(let r of result){
  323. if(r.missCodes && r.missCodes.length >0) missCodes =missCodes.concat(r.missCodes);
  324. }
  325. if(missCodes.length > 0) alert(`没有找到人材机:${missCodes.join("、")}`);
  326. }catch (err){
  327. console.log(err);
  328. }
  329. this.showMaterialList();
  330. },
  331. saveBills:async function (datas) {
  332. try {
  333. let result = await ajaxPost("/materialReplace/saveBills",datas);
  334. let missCodes = [];
  335. for(let r of result){
  336. if(r.missCodes && r.missCodes.length >0) missCodes =missCodes.concat(r.missCodes);
  337. if(r.type == 'add'){
  338. this.allBills = this.allBills.concat(r.list);
  339. }if(r.type == 'update'){
  340. for(let l of r.list){
  341. this.updateBillsCache(l.code,l.updateData);
  342. }
  343. }if(r.type == 'delete'){
  344. _.remove(this.allBills,function (item) {
  345. return _.includes(r.list,item.ID)
  346. })
  347. }
  348. }
  349. if(missCodes.length > 0) alert(`没有找到清单:${missCodes.join("、")}`);
  350. }catch (err){
  351. console.log(err);
  352. }
  353. this.refreshSheet();
  354. },
  355. saveDatas:async function (datas,type ='bills') {
  356. try {
  357. let currentList = type =='bills'?this.billsList:this.materialList;
  358. let url = type =='bills'?"/materialReplace/saveBills":"/materialReplace/saveMaterial";
  359. let text = type =='bills'?"清单":"人材机";
  360. let result = await ajaxPost(url,datas);
  361. let missCodes = [];
  362. for(let r of result){
  363. if(r.missCodes && r.missCodes.length >0) missCodes =missCodes.concat(r.missCodes);
  364. if(r.type == 'add'){
  365. currentList = currentList.concat(r.list);
  366. }if(r.type == 'update'){
  367. for(let l of r.list){
  368. type =='bills'?this.updateBillsCache(l.code,l.updateData):this.updateMaterialCache(l.ID,l.updateData);
  369. }
  370. }if(r.type == 'delete'){
  371. _.remove(currentList,function (item) {
  372. return _.includes(r.list,item.ID)
  373. })
  374. }
  375. }
  376. if(missCodes.length > 0) alert(`没有找到${text}:${missCodes.join("、")}`);
  377. }catch (err){
  378. console.log(err);
  379. }
  380. },
  381. getMaterialByBillsID:async function(billsItemID){
  382. try {
  383. let result = await ajaxPost("/materialReplace/findMaterial",{billsItemID:billsItemID});
  384. return result;
  385. }catch (err){
  386. console.log(err);
  387. return [];
  388. }
  389. },
  390. updateMaterialCache:function (ID,updateData) {
  391. this.updateCache(this.materialList,{'ID':ID},updateData)
  392. },
  393. updateBillsCache:function (code,updateData) {
  394. this.updateCache(this.allBills,{'code':code},updateData)
  395. },
  396. updateCache:function (list,condition,updateData) {
  397. let item = _.find(list,condition);
  398. for(let key in updateData){
  399. item[key] = updateData[key]
  400. }
  401. }
  402. };
  403. let last = 0;
  404. $(document).ready(function () {
  405. $("#keyword").on('input propertychange', function(event) {
  406. last = event.timeStamp;//利用event的timeStamp来标记时间,这样每次事件都会修改last的值,注意last必需为全局变量
  407. setTimeout(function () { //设时延迟0.5s执行
  408. if (last - event.timeStamp == 0) { //如果时间差为0(也就是你停止输入0.5s之内都没有其它的keyup事件发生)则做你想要做的事
  409. materialOjb.refreshSheet();
  410. }
  411. }, 500);
  412. })
  413. });
  414. function isDef(obj) {
  415. return obj!==undefined && obj!==null;
  416. }
  417. materialOjb.initSpread();