ration_installation.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. /**
  2. * Created by Zhong on 2018/1/25.
  3. */
  4. let rationInstObj = {
  5. IDMapping: null, //ID - name
  6. feeItem: null, //name - ID
  7. sheet: null,
  8. rationRepId: null,
  9. curRation: null,
  10. cache: [],
  11. setting: {
  12. header:[
  13. {headerName:"费用项",headerWidth:120,dataCode:"feeItem", dataType: "String", hAlign: 'left'},
  14. {headerName:"分册章节",headerWidth:400,dataCode:"section", dataType: "String", hAlign: 'left'}
  15. ],
  16. view:{
  17. comboBox:[],
  18. lockColumns:[]
  19. },
  20. },
  21. buildSheet: function(sheet) {
  22. let me = this;
  23. me.sheet = sheet;
  24. me.sheet.options.clipBoardOptions = GC.Spread.Sheets.ClipboardPasteOptions.values;
  25. me.rationRepId = parseInt(pageOprObj.rationLibId); // 不可靠,有时取不到
  26. if (me.rationRepId == undefined){me.rationRepId = parseInt(getQueryString('repository'))};
  27. sheetCommonObj.initSheet(me.sheet, me.setting, 30);
  28. me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
  29. me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
  30. me.sheet.bind(GC.Spread.Sheets.Events.EnterCell, me.onEnterCell);
  31. me.sheet.bind(GC.Spread.Sheets.Events.EditStarting, me.onEditStarting);
  32. me.sheet.bind(GC.Spread.Sheets.Events.EditEnded, me.onEditEnded);
  33. //右键
  34. // me.onContextmenuOpr();
  35. },
  36. renderFunc: function (sheet, func) {
  37. sheet.suspendPaint();
  38. sheet.suspendEvent();
  39. if(func){
  40. func();
  41. }
  42. sheet.resumePaint();
  43. sheet.resumeEvent();
  44. },
  45. isDef: function (v) {
  46. return v !== undefined && v !== null;
  47. },
  48. getInstallation: function (rationRepId, callback) {
  49. let me = this;
  50. CommonAjax.post('/rationRepository/api/getInstallation', {rationRepId: rationRepId}, function (rstData) {
  51. //建立name - ID 映射, ID - name 映射
  52. me.feeItem = {};
  53. me.IDMapping = {feeItem: {}, section: {}};
  54. for(let feeItem of rstData){
  55. me.feeItem[feeItem.feeItem] = {ID: feeItem.ID, section: {}};
  56. me.IDMapping['feeItem'][feeItem.ID] = feeItem.feeItem;
  57. for(let section of feeItem.section){
  58. me.feeItem[feeItem.feeItem]['section'][section.name] = section.ID;
  59. me.IDMapping['section'][section.ID] = section.name;
  60. }
  61. }
  62. if(callback){
  63. callback(rstData);
  64. }
  65. });
  66. },
  67. getFeeItemCombo: function () {
  68. let feeItemArr = [];
  69. for(let name in this.feeItem){
  70. feeItemArr.push(name);
  71. }
  72. let combo = sheetCommonObj.getDynamicCombo();
  73. combo.items(feeItemArr).itemHeight(10).editable(false);
  74. return combo;
  75. },
  76. getSectionCombo: function (feeItem) {
  77. let sectionObjs = this.feeItem[feeItem]['section'];
  78. let sectionArr = [];
  79. for(let name in sectionObjs){
  80. sectionArr.push(name);
  81. }
  82. let combo = sheetCommonObj.getDynamicCombo();
  83. combo.items(sectionArr).itemHeight(10).editable(false);
  84. return combo;
  85. },
  86. getInstItems: function (ration, callback) {
  87. let me = this, rst = [];
  88. me.curRation = ration;
  89. me.cache = ration.rationInstList;
  90. for(let inst of me.cache){
  91. let data = Object.create(null);
  92. let feeItem = me.IDMapping['feeItem'][inst.feeItemId];
  93. let section = me.IDMapping['section'][inst.sectionId];
  94. data.feeItem = me.isDef(feeItem) ? feeItem : '';
  95. data.section = me.isDef(section) ? section : '';
  96. rst.push(data);
  97. }
  98. me.showInstItems(rst);
  99. if(callback){
  100. callback();
  101. }
  102. },
  103. showInstItems: function (data) {
  104. let me = this;
  105. sheetCommonObj.showData(this.sheet, this.setting, data);
  106. //init combo
  107. this.renderFunc(this.sheet, function () {
  108. let feeIemCombo = me.getFeeItemCombo();
  109. let rowCount = me.sheet.getRowCount();
  110. for(let i = 0, len = rowCount.length; i < len; i++){
  111. me.getRange(i, -1, 1, -1).cellType(null);
  112. }
  113. me.sheet.getRange(-1, 0, -1, 1).cellType(feeIemCombo);
  114. for(let i = 0, len = data.length; i < len; i++){
  115. let sectionCombo = me.getSectionCombo(data[i].feeItem);
  116. me.sheet.getCell(i, 1).cellType(sectionCombo);
  117. }
  118. });
  119. },
  120. onEnterCell: function (sender, args) {
  121. args.sheet.repaint();
  122. },
  123. onEditStarting: function (sender, args) {
  124. let me = rationInstObj;
  125. if(!me.isDef(me.curRation)){
  126. args.cancel = true;
  127. return;
  128. }
  129. if(!me.isDef(me.cache[args.row]) && args.col === 1){
  130. args.cancel = true;
  131. return;
  132. }
  133. },
  134. onEditEnded: function (sender, args) {
  135. let me = rationInstObj;
  136. let v = me.isDef(args.editingText) ? args.editingText.toString().trim() : '';
  137. let field = me.setting.header[args.col]['dataCode'];
  138. let inst = me.cache[args.row];
  139. let toUpdate = false;
  140. //update
  141. if(me.isDef(inst)){
  142. if(field === 'feeItem'){
  143. let feeItemId = me.isDef(me.feeItem[v]) ? me.feeItem[v]['ID'] : null;
  144. if(feeItemId){
  145. inst.feeItemId = feeItemId;
  146. toUpdate = true;
  147. }
  148. else {
  149. me.sheet.setValue(args.row, args.col, me.IDMapping['feeItem'][inst.feeItemId]);
  150. return;
  151. }
  152. }
  153. else{
  154. let sectionId = me.isDef(me.feeItem[me.IDMapping['feeItem'][inst.feeItemId]]) ? me.feeItem[me.IDMapping['feeItem'][inst.feeItemId]]['section'][v] : null;
  155. inst.sectionId = sectionId;
  156. toUpdate = true;
  157. }
  158. }
  159. //insert
  160. else{
  161. let feeItemId = me.isDef(me.feeItem[v]) ? me.feeItem[v]['ID'] : null;
  162. if(feeItemId){
  163. let obj = {feeItemId: feeItemId, sectionId: null};
  164. me.cache.push(obj);
  165. toUpdate = true;
  166. }
  167. }
  168. if(toUpdate){
  169. me.updateRation(me.curRation, function () {
  170. me.getInstItems(me.curRation);
  171. });
  172. }
  173. },
  174. validUpdatePaste: function (rowData, data) {
  175. if(this.isDef(data.feeItem) && this.isDef(data.section) && data.feeItem !== '' && data.section !== ''){
  176. if(!this.isDef(this.feeItem[data.feeItem])){
  177. return false;
  178. }
  179. if(!this.isDef(this.feeItem[data.feeItem]['section'][data.section])){
  180. return false;
  181. }
  182. }
  183. else if(this.isDef(data.feeItem) && data.feeItem !== ''){
  184. if(!this.isDef(this.feeItem[data.feeItem])){
  185. return false;
  186. }
  187. }
  188. else if(this.isDef(data.section) && data.section !== ''){
  189. if(!this.isDef(this.feeItem[this.IDMapping['feeItem'][rowData.feeItemId]]['section'][data.section])){
  190. return false;
  191. }
  192. }
  193. return true;
  194. },
  195. validInsertPaste: function (data) {
  196. if(!this.isDef(data.feeItem) || data.feeItem == ''){
  197. return false;
  198. }
  199. if(!this.isDef(this.feeItem[data.feeItem])){
  200. return false;
  201. }
  202. if(this.isDef(data.section) && data.section !== '' && !this.isDef(this.feeItem[data.feeItem]['section'][data.section])){
  203. return false;
  204. }
  205. return true;
  206. },
  207. toSaveData: function (data, rowData = null) {
  208. let obj = {feeItemId: null, sectionId: null};
  209. if(this.isDef(data.feeItem) && data.feeItem !== ''){
  210. obj.feeItemId = this.isDef(this.feeItem[data.feeItem]) ? this.feeItem[data.feeItem]['ID'] : null;
  211. }
  212. else if(this.isDef(rowData)){
  213. obj.feeItemId = rowData.feeItemId;
  214. }
  215. if(this.isDef(data.section) && data.section !== ''){
  216. obj.sectionId = this.isDef(this.feeItem[this.IDMapping['feeItem'][obj.feeItemId]]['section'][data.section]) ?
  217. this.feeItem[this.IDMapping['feeItem'][obj.feeItemId]]['section'][data.section]: null;
  218. }
  219. return obj;
  220. },
  221. bindRationInstDel: function () {
  222. let me = this;
  223. let workBook = me.sheet.getParent();
  224. workBook.commandManager().register('rationInstDel', function () {
  225. let toUpdate = false;
  226. let sels = me.sheet.getSelections();
  227. for(let i = 0, len = sels.length; i < len; i++){
  228. let sel = sels[i];
  229. //delete
  230. if(sel.colCount === me.setting.header.length){
  231. for(let j = 0, jLen = sel.rowCount; j < jLen; j++){
  232. let row = sel.row + j;
  233. let inst = me.cache[row];
  234. //有数据,删除数据
  235. if(me.isDef(inst)){
  236. if(!toUpdate){
  237. toUpdate = true;
  238. }
  239. }
  240. }
  241. //front delete
  242. me.cache.splice(sel.row, sel.rowCount);
  243. }
  244. }
  245. if(toUpdate && me.curRation){
  246. me.updateRation(me.curRation, function () {
  247. me.getInstItems(me.curRation);
  248. });
  249. }
  250. });
  251. workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
  252. workBook.commandManager().setShortcutKey('rationInstDel', GC.Spread.Commands.Key.del, false, false, false, false);
  253. },
  254. onClipboardPasting: function (sender, info) {
  255. let me = rationInstObj;
  256. if(!me.isDef(me.curRation)){
  257. info.cancel = true;
  258. }
  259. },
  260. onClipboardPasted: function (sender, info) {
  261. let me = rationInstObj;
  262. let items = sheetCommonObj.analyzePasteData(me.setting, info);
  263. let toUpdate = false;
  264. for(let i = 0, len = items.length; i < len; i++){
  265. let row = info.cellRange.row + i;
  266. //update
  267. let inst = me.cache[row];
  268. if(me.isDef(inst)){
  269. if(me.validUpdatePaste(inst, items[i])){
  270. let updateObj = me.toSaveData(items[i], inst);
  271. for(let attr in updateObj){
  272. inst[attr] = updateObj[attr];
  273. }
  274. toUpdate = true;
  275. }
  276. }
  277. //insert
  278. else{
  279. if(me.validInsertPaste(items[i])){
  280. me.cache.push(me.toSaveData(items[i]));
  281. toUpdate = true;
  282. }
  283. }
  284. }
  285. if(toUpdate){
  286. me.updateRation(me.curRation, function () {
  287. me.getInstItems(me.curRation);
  288. });
  289. }
  290. else {
  291. me.getInstItems(me.curRation);
  292. }
  293. },
  294. updateRation: function (ration,callback) {
  295. rationOprObj.mixUpdateRequest([ration], [], [], function () {
  296. if(callback){
  297. callback();
  298. }
  299. });
  300. }
  301. };