quantity_edit_view.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. /**
  2. * Created by zhang on 2018/7/20.
  3. */
  4. let quantityEditObj = {
  5. spread:null,
  6. datas:[],
  7. setting:{
  8. header:[
  9. {headerName: "基数名称", headerWidth: 250, dataCode: "name", dataType: "String"},
  10. {headerName: "代码", headerWidth: 150, dataCode: "code", dataType: "String"},
  11. ],
  12. view: {
  13. lockColumns: [0,1]
  14. }
  15. },
  16. initSpread:function () {
  17. if(!this.spread){
  18. this.spread = SheetDataHelper.createNewSpread($("#quantityEditSpread")[0]);
  19. this.initSheet();
  20. }else {
  21. this.spread.refresh();
  22. }
  23. this.showData();
  24. },
  25. initSheet:function () {
  26. this.sheet = this.spread .getSheet(0);
  27. sheetCommonObj.initSheet( this.sheet, this.setting, 30);
  28. this.sheet.bind(GC.Spread.Sheets.Events.CellDoubleClick,this.onCellDoubleClick);
  29. this.sheet.name('quantityEdit');
  30. // console.log(cell.value());
  31. },
  32. showData:function () {
  33. this.datas = [];//{name:'工程量明细合计',code:'GCLMXHJ'}这里暂时只有清单量一个选项
  34. let selected = projectObj.project.mainTree.selected;
  35. if(selected.sourceType == ModuleNames.ration){
  36. this.datas.push({name:'清单量',code:'QDL'});
  37. }
  38. sheetCommonObj.showData(this.sheet, this.setting,this.datas);
  39. this.sheet.setRowCount(this.datas.length);
  40. },
  41. onCellDoubleClick:function (e,info) {
  42. if(quantityEditObj.datas[info.row]){
  43. $("#quantityEXPValue").focus();
  44. quantityEditObj.setToQuantityEXP(quantityEditObj.datas[info.row].code);
  45. quantityEditObj.spread.focus(false);
  46. }
  47. },
  48. setToQuantityEXP:function (value) {
  49. let oldVal = $("#quantityEXPValue").val();
  50. let startIndex = getCursor($("#quantityEXPValue")[0]);//取光标位置
  51. let strartString = oldVal.substring(0,startIndex);
  52. let endString = oldVal.substring(startIndex);
  53. $("#quantityEXPValue").val(strartString+value+endString);
  54. setCursor($("#quantityEXPValue")[0],startIndex+value.length);//设置回光标位置
  55. },
  56. getQuantityEditCellType:function () {//这个需配合整个表的selection change事件,当change的时候会repaint,按钮会显示
  57. var ns = GC.Spread.Sheets;
  58. function QuantityEditCellType() {
  59. var init=false;
  60. this.clickTime = 0; //点击事件时间戳
  61. }
  62. QuantityEditCellType.prototype = new ns.CellTypes.Text();
  63. QuantityEditCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
  64. let me=quantityEditObj;
  65. if(!projectReadOnly){
  66. if(options.sheet.getActiveRowIndex()==options.row&&options.sheet.getActiveColumnIndex()==options.col){
  67. /* var image = document.getElementById('f_btn'),imageMagin = 3;
  68. var imageHeight = 15;
  69. var imageWidth = 25;
  70. var imageX = x + w - imageWidth- imageMagin, imageY = y + h / 2 - imageHeight / 2;
  71. ctx.save();
  72. ctx.fillStyle = style.backColor;
  73. ctx.fillRect(x,y,w,h);
  74. ctx.drawImage(image, imageX, imageY,imageWidth,imageHeight);
  75. ctx.beginPath();
  76. ctx.arc(imageX+imageWidth/2,imageY+imageHeight/2,1,0,360,false);
  77. ctx.arc(imageX+imageWidth/2-4,imageY+imageHeight/2,1,0,360,false);
  78. ctx.arc(imageX+imageWidth/2+4,imageY+imageHeight/2,1,0,360,false);
  79. ctx.fillStyle="black";//填充颜色,默认是黑色
  80. ctx.fill();//画实心圆
  81. ctx.closePath();
  82. ctx.restore();
  83. w = w - imageWidth - imageMagin; */
  84. if(options.sheet.getCell(options.row,options.col).locked() != true){
  85. SheetDataHelper.showMoreButton({sheet:options.sheet,cellRect:{x,y,width: w,height:h},row:options.row },function(row){
  86. me.showSelectModal(row);
  87. })
  88. }
  89. }
  90. }
  91. GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
  92. };
  93. /* QuantityEditCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
  94. return {
  95. x: x,
  96. y: y,
  97. row: context.row,
  98. col: context.col,
  99. cellStyle: cellStyle,
  100. cellRect: cellRect,
  101. sheetArea: context.sheetArea
  102. };
  103. };
  104. */
  105. //2018 -09 -26 修改工程量这个输入控件,删除悬浮提示注释,还原时通过git 历史
  106. //2021 -04 -16 悬浮提示到表格外面
  107. /* QuantityEditCellType.prototype.processMouseDown = function (hitinfo) {
  108. let me=quantityEditObj;
  109. if(hitinfo.sheet.getActiveRowIndex()==hitinfo.row&&hitinfo.sheet.getActiveColumnIndex()==hitinfo.col){
  110. var offset=hitinfo.cellRect.x+hitinfo.cellRect.width-6;
  111. var imageWidth = 25;
  112. if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
  113. if(!projectReadOnly){
  114. me.showSelectModal(hitinfo);
  115. }
  116. }
  117. }
  118. }; */
  119. return new QuantityEditCellType();
  120. },
  121. showSelectModal:function (row) {
  122. //锁定的清单不显示
  123. let project = projectObj.project;
  124. if(project.mainTree.selected.sourceType == ModuleNames.bills && project.isBillsLocked() && project.withinBillsLocked(project.mainTree.selected)){
  125. return;
  126. }
  127. this.initModalContent(row);
  128. $("#quantityEXPEdit").modal({show:true});
  129. },
  130. initModalContent:function (row) {
  131. //现在改成有可能点击时,还没选中节点,所以要靠row来判断
  132. let selected = projectObj.project.mainTree.items[row];
  133. if(selected.sourceType == ModuleNames.ration){//暂时只有定额才有基数选择,所以其它的先隐藏表格
  134. $("#quantityEditSpread").show();//quantityEditSpread
  135. }else {
  136. $("#quantityEditSpread").hide();
  137. }
  138. $("#quantityEXPValue").val(selected.data.quantityEXP);
  139. selected.data.quantityEXP == "GCLMXHJ" || selected.data.quantityEXP =="MBGCL"?$("#quantityEXPValue").attr("disabled","disabled"):$("#quantityEXPValue").removeAttr("disabled");
  140. },
  141. checkingAndUpdate(quantityEXP,node){
  142. let me = this;
  143. /* if(quantityEXP === node.data.quantityEXP){ //没有变化,不做任何操作
  144. projectObj.mainController.refreshTreeNode([node]);
  145. return true;
  146. }*/
  147. quantityEXP = quantityEXP?quantityEXP.toUpperCase():'';//非空判断
  148. quantityEXP =replaceAll('(','(',quantityEXP);//转换中文左右符号与。、
  149. quantityEXP =replaceAll(')',')',quantityEXP);
  150. quantityEXP =replaceAll('。','.',quantityEXP);
  151. quantityEXP =replaceAll('、','/',quantityEXP);
  152. quantityEXP = quantityEXP.replace(/[\s\r\n]/g, "")//去掉空格回车换行等字符
  153. let value = me.evalQuantityExp(quantityEXP,node);
  154. if(value!=='evalError'){
  155. if(node.data.hasOwnProperty('isFromDetail')&&node.data.isFromDetail==1){
  156. hintBox.infoBox('操作确认', '已有工程量明细,是否清空明细表?', 2, function () {
  157. node.data.isFromDetail=0;
  158. me.updateQuantityEXP(value,quantityEXP,node);
  159. }, function () {
  160. projectObj.mainController.refreshTreeNode([node]);
  161. },['确定','取消'],false);
  162. return true;
  163. }
  164. me.updateQuantityEXP(value,quantityEXP,node);
  165. return true;
  166. }else {
  167. projectObj.mainController.refreshTreeNode([node]);
  168. }
  169. return false;
  170. },
  171. evalQuantityExp(quantityEXP,node){
  172. let evalString = quantityEXP;
  173. //求余% 换成 * 0.01 再计算
  174. evalString =handlePercent(evalString);
  175. if( node.sourceType == ModuleNames.ration && quantityEXP.indexOf('QDL')!=-1){
  176. let billNode = node.parent;
  177. let bQuantity = 0;
  178. if(billNode.updateData.quantity){
  179. bQuantity = scMathUtil.roundForObj(billNode.updateData.quantity,getDecimal("quantity",billNode));
  180. }else {
  181. bQuantity = billNode.data.quantity?scMathUtil.roundForObj(billNode.data.quantity,getDecimal("quantity",billNode)):0;
  182. }
  183. evalString = replaceAll("QDL","("+bQuantity+")",evalString);
  184. }
  185. try {
  186. let value = undefined;
  187. //2021-1-14 工程量表达式中,允许输入“{、}”,花括号内的内容不参与计算,用户输入备注。如:“QDL*0.23{厚度}”、“10{长度}*5.8{宽度}”。
  188. evalString = replaceAll("\{[^\}]*\}","",evalString);//[^\}] 表示匹配非}
  189. if(evalString&&evalString!=""){
  190. let exp = new Expression('');
  191. exp.Expression(evalString);
  192. value = Number(exp.Evaluate());
  193. if(isNaN(value)) throw new Error("输入的表达式有误");
  194. }
  195. return value;
  196. }catch (error){
  197. alert("输入的表达式有误,请重新输入!");
  198. return "evalError";
  199. }
  200. },
  201. updateQuantityEXP:function (value,quantityEXP,node) {
  202. let quantity_detail = projectObj.project.quantity_detail;
  203. if(node.data.hasOwnProperty('isFromDetail')&&node.data.isFromDetail==1) quantity_detail.cleanQuantityDetail(node,true);
  204. if(node.sourceType === ModuleNames.bills){
  205. if(quantityEXP!=""&& node.data.unit == "公路公里" && quantityEditObj.infoShowing!==true){
  206. quantityEditObj.infoShowing = true
  207. hintBox.infoBox('操作确认', '是否将所有单位等于"公路公里"的项目的工程量都设为该值?', 2, function () {
  208. quantity_detail.updateBillQuantity(value,node,quantityEXP,quantityEXP,true);
  209. quantityEditObj.infoShowing = false
  210. }, function () {
  211. quantity_detail.updateBillQuantity(value,node,quantityEXP,quantityEXP);
  212. quantityEditObj.infoShowing = false
  213. },['是','否']);
  214. return;
  215. }
  216. quantity_detail.updateBillQuantity(value,node,quantityEXP,quantityEXP);
  217. }else {
  218. quantity_detail.updateRationQuantity(value,node,quantityEXP,quantityEXP);
  219. }
  220. }
  221. };
  222. $(function(){
  223. $('#quantityEXPEdit').on('shown.bs.modal', function (e) {
  224. projectObj.mainSpread.focus(false);
  225. quantityEditObj.initSpread();
  226. $("#quantityEXPValue").focus();
  227. });
  228. $('#operation_p').children("button").bind('click',function (){
  229. quantityEditObj.setToQuantityEXP($(this).text());
  230. $("#quantityEXPValue").focus();
  231. });
  232. $("#quantityEditConf").bind('click',function () {
  233. let selected = projectObj.project.mainTree.selected;
  234. let result = quantityEditObj.checkingAndUpdate($("#quantityEXPValue").val(),selected);
  235. if(result == true){
  236. $("#quantityEXPEdit").modal('hide');
  237. }
  238. })
  239. $('#quantityEXPEdit').bind('keypress', function (event) {
  240. if(event.keyCode === 13){
  241. $("#quantityEditConf").click();
  242. event.preventDefault();
  243. }
  244. });
  245. });
  246. function getCursor(elem) {
  247. //IE 9 ,10,其他浏览器
  248. if (elem.selectionStart !== undefined) {
  249. return elem.selectionStart;
  250. } else { //IE 6,7,8
  251. var range = document.selection.createRange();
  252. range.moveStart("character", -elem.value.length);
  253. var len = range.text.length;
  254. return len;
  255. }
  256. }
  257. function setCursor(elem, index) {
  258. //IE 9 ,10,其他浏览器
  259. if (elem.selectionStart !== undefined) {
  260. elem.selectionStart = index;
  261. elem.selectionEnd = index;
  262. } else { //IE 6,7,8
  263. var range = elem.createTextRange();
  264. range.moveStart("character", -elem.value.length); //左边界移动到起点
  265. range.move("character", index); //光标放到index位置
  266. range.select();
  267. }
  268. }
  269. function setSelection(elem, leftIndex, rightIndex) {
  270. if (elem.selectionStart !== undefined) { //IE 9 ,10,其他浏览器
  271. elem.selectionStart = leftIndex;
  272. elem.selectionEnd = rightIndex;
  273. } else { //IE 6,7,8
  274. var range = elem.createTextRange();
  275. range.move("character", -elem.value.length); //光标移到0位置。
  276. //这里一定是先moveEnd再moveStart
  277. //因为如果设置了左边界大于了右边界,那么浏览器会自动让右边界等于左边界。
  278. range.moveEnd("character", rightIndex);
  279. range.moveStart("character", leftIndex);
  280. range.select();
  281. }
  282. }