glj_index.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. /**
  2. * 聊天室相关
  3. *
  4. * @author CaiAoLin
  5. * @date 2017/6/15
  6. * @version
  7. */
  8. $(document).ready(function () {
  9. // excel
  10. let header = [
  11. {name: '编码', field: 'code', visible: true},
  12. {name: '名称', field: 'name', visible: true},
  13. {name: '规格型号', field: 'unit_price.specs', visible: true},
  14. {name: '单位', field: 'unit_price.unit', visible: true},
  15. {name: 'ID', field: 'id', visible: false},
  16. {name: '类型', field: 'unit_price.type', visible: false},
  17. {name: '人工工种', field: 'type_of_work', visible: false},
  18. {name: '总消耗量', field: '', visible: true},
  19. {name: '基价单价', field: "unit_price.base_price", visible: true},
  20. {name: '调整基价', field: 'adjust_price', visible: true},
  21. {name: '市场单价', field: "unit_price.market_price", visible: true},
  22. {name: '是否暂估', field: 'is_evaluate', visible: true, cellType: new GC.Spread.Sheets.CellTypes.CheckBox()},
  23. {name: '供货方式', field: 'supply', visible: true},
  24. {name: '甲供数量', field: 'supply_quantity', visible: true},
  25. {name: '交货方式', field: 'delivery', visible: true},
  26. {name: '送达地点', field: 'delivery_address', visible: true},
  27. {name: '不调价', field: 'is_adjust_price', visible: true, cellType: new GC.Spread.Sheets.CellTypes.CheckBox()},
  28. {name: 'UID', field: 'unit_price.id', visible: false},
  29. ];
  30. // 数据转换格式
  31. let sourceData = JSON.parse(jsonData);
  32. let setting = {
  33. header: []
  34. };
  35. for(let tmp of header) {
  36. setting.header.push({headerName: tmp.name, headerWidth: 120});
  37. }
  38. let spread = sheetCommonObj.buildSheet(document.getElementById("test"), setting, sourceData.length);
  39. spread.options.scrollbarShowMax = true;
  40. spread.options.scrollbarMaxAlign = true;
  41. spread.options.showHorizontalScrollbar = true;
  42. let sheet = spread.getActiveSheet();
  43. // 设置表单不可编辑
  44. sheet.options.isProtected = true;
  45. // 居中样式
  46. let centerStyleSetting = {hAlign: 1};
  47. sheet.setStyle(-1, 11, getStyle(centerStyleSetting), GC.Spread.Sheets.SheetArea.viewport);
  48. sheet.setStyle(-1, 16, getStyle(centerStyleSetting), GC.Spread.Sheets.SheetArea.viewport);
  49. sheet.setStyle(-1, 3, getStyle(centerStyleSetting), GC.Spread.Sheets.SheetArea.viewport);
  50. // 向右对齐样式
  51. let rightStyleSetting = {hAlign: GC.Spread.Sheets.HorizontalAlign.right};
  52. sheet.setStyle(-1, 7, getStyle(rightStyleSetting), GC.Spread.Sheets.SheetArea.viewport);
  53. sheet.setStyle(-1, 8, getStyle(rightStyleSetting), GC.Spread.Sheets.SheetArea.viewport);
  54. sheet.setStyle(-1, 9, getStyle(rightStyleSetting), GC.Spread.Sheets.SheetArea.viewport);
  55. sheet.setStyle(-1, 10, getStyle(rightStyleSetting), GC.Spread.Sheets.SheetArea.viewport);
  56. // 设置可编辑列
  57. sheet.getRange(-1, 10, -1, 1).locked(false);
  58. sheet.getRange(-1, 11, -1, 1).locked(false);
  59. sheet.getRange(-1, 16, -1, 1).locked(false);
  60. // 设置json数据
  61. let rowCounter = 0;
  62. for(let data of sourceData) {
  63. let columnCounter = 0;
  64. for(let columnInfo of header) {
  65. // 设置是否显示
  66. sheet.setColumnVisible(columnCounter, columnInfo.visible);
  67. let dataString = columnInfo.field !== '' && columnInfo.field !== undefined ?
  68. "data." + columnInfo.field : '';
  69. let cellData = eval(dataString);
  70. // 设置复选框
  71. if (columnInfo.cellType !== undefined) {
  72. let checkbox = new GC.Spread.Sheets.CellTypes.CheckBox();
  73. sheet.setCellType(rowCounter, columnCounter, checkbox, GC.Spread.Sheets.SheetArea.viewport);
  74. }
  75. // 如果不为材料“是否暂估列”根据条件显示
  76. if (columnInfo.field === 'is_evaluate' && materialIdList.indexOf(data.unit_price.type + '') < 0) {
  77. let string = new GC.Spread.Sheets.CellTypes.Text();
  78. sheet.setCellType(rowCounter, columnCounter, string, GC.Spread.Sheets.SheetArea.viewport);
  79. cellData = '';
  80. // 并且锁定该单元格
  81. sheet.getRange(rowCounter, columnCounter, 1, 1).locked(true);
  82. }
  83. sheet.setValue(rowCounter, columnCounter, cellData, GC.Spread.Sheets.SheetArea.viewport);
  84. columnCounter++;
  85. }
  86. rowCounter++;
  87. }
  88. /*
  89. let socket = io('http://notify.smartcost.com.cn:3300');
  90. socket.on('connect', function () {
  91. socket.emit('join', project);
  92. console.log('连接成功');
  93. });
  94. // 接受到改变
  95. let changeInfo = [];
  96. socket.on('dataChange', function(data) {
  97. data = JSON.parse(data);
  98. if (data.newValue === undefined) {
  99. return false;
  100. }
  101. changeInfo.push(data);
  102. $("#message").html('基价单位已被修改,<a href="javascript:void(0);" id="load-data">点击加载</a>');
  103. $("#notify").slideDown('fast');
  104. initiativeChange = false;
  105. });
  106. // 是否主动更改数据
  107. let initiativeChange = false;
  108. $("#message").on('click', '#load-data', function() {
  109. $("#notify").slideUp('fast');
  110. if (changeInfo.length > 0) {
  111. for (let index in changeInfo) {
  112. let cell = sheet.getCell(changeInfo[index].row, changeInfo[index].col, GC.Spread.Sheets.SheetArea.viewport);
  113. cell.value(changeInfo[index].newValue);
  114. }
  115. }
  116. changeInfo = [];
  117. });
  118. // 进入单元格后设置为主动设置数据
  119. sheet.bind(GC.Spread.Sheets.Events.EditEnding, function (element, info) {
  120. initiativeChange = true;
  121. });
  122. */
  123. // 绑定事件
  124. let isChanging = false;
  125. sheet.bind(GC.Spread.Sheets.Events.ValueChanged, function (element, info) {
  126. // 获取修改的数据
  127. let column = info.col;
  128. let row = info.row;
  129. let model = 'glj';
  130. let idString = 'id';
  131. let field = header[column] !== undefined && header[column].field !== undefined ?
  132. header[column].field : '';
  133. if (field === '') {
  134. return false;
  135. }
  136. // 切割字段
  137. let fieldArray = field.split('.');
  138. idString = fieldArray.length > 1 ? 'unit_price.id' : idString;
  139. // 防止快速同时提交
  140. if (isChanging) {
  141. return false;
  142. }
  143. // 获取id
  144. let idColumn = getFieldColumn(header, idString);
  145. if (idColumn < 0) {
  146. return false;
  147. }
  148. let id = sheet.getValue(row, idColumn);
  149. $.ajax({
  150. url: '/glj/update',
  151. type: 'post',
  152. data: {id: id, field: field, value: info.newValue, model: model},
  153. dataType: 'json',
  154. error: function() {
  155. alert('数据传输有误!');
  156. isChanging = false;
  157. },
  158. beforeSend: function() {
  159. isChanging = true;
  160. },
  161. success: function(response) {
  162. isChanging = false;
  163. // 修改失败则恢复原值
  164. if (response.err !== 0) {
  165. sheet.setValue(row, column, info.oldValue);
  166. alert('更改数据失败!');
  167. } else {
  168. // 成功
  169. }
  170. }
  171. });
  172. /*
  173. // 如果修改了数据且为主动修改,先存库再广播给其他页面
  174. if (info.newValue !== undefined && info.oldValue !== undefined && initiativeChange) {
  175. let id = sheet.getCell(info.row, 0).value();
  176. $.ajax({
  177. url: '/save',
  178. type: 'post',
  179. data: {priceValue: info.newValue, id: id},
  180. error: function() {
  181. // @todo 替换为更好地错误提示
  182. alert('error');
  183. },
  184. beforeSend: function() {
  185. },
  186. success: function(response) {
  187. if (response.err === 0) {
  188. socket.emit('dataNotify', JSON.stringify(info));
  189. } else {
  190. // @todo 替换为更好地错误提示
  191. alert(response.msg);
  192. }
  193. }
  194. });
  195. }
  196. */
  197. });
  198. });
  199. /**
  200. * 生成样式
  201. *
  202. * @param {object} setting
  203. * @return {object}
  204. */
  205. function getStyle(setting) {
  206. let style = new GC.Spread.Sheets.Style();
  207. style.locked = setting.readOnly === undefined ? true : setting.readOnly;
  208. style.hAlign = setting.hAlign === undefined ? GC.Spread.Sheets.HorizontalAlign.center : setting.hAlign;
  209. return style;
  210. }
  211. /**
  212. * 查找指定字段的列index
  213. *
  214. * @param {object} data
  215. * @param {String} field
  216. * @return {Number}
  217. */
  218. function getFieldColumn(data, field) {
  219. let result = -1;
  220. if (data.length <= 0) {
  221. return result;
  222. }
  223. for (let tmp in data) {
  224. if (data[tmp].field === field) {
  225. result = tmp;
  226. break;
  227. }
  228. }
  229. return result;
  230. }