project_property_decimal_view.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /**
  2. * Created by Zhong on 2017/11/13.
  3. */
  4. //default setting
  5. let defaultDecimal = {
  6. min: 0,
  7. max: 6,
  8. _def: {//定义往这加, editable: 开放给用户编辑的(入库),定义editable为true的字段时,要在后端project_model.js defaultDecimal中添加定义,html添加input
  9. bills: {editable: true, data: {unitPrice: 2, totalPrice: 2}},
  10. ration: {editable: true, data: {quantity: 3, unitPrice: 2, totalPrice: 2}},
  11. glj: {editable: true, data: {quantity: 3, unitPrice: 2}},
  12. feeRate: {editable: true, data: 2},
  13. quantity_detail: {editable: false, data: 4},
  14. process: {editable: false, data: 6}
  15. }
  16. };
  17. let decimalObj = Object.create(null);
  18. function isUndef(v) {
  19. return v === undefined || v === null;
  20. }
  21. function isDef(v){
  22. return v !== undefined && v !== null;
  23. }
  24. function isObj(v){
  25. return isDef(v) && typeof v === 'object';
  26. }
  27. function isNum(v){
  28. return isDef(v) && !isNaN(v);
  29. }
  30. function isInt(v){
  31. return isNum(v) && v % 1 === 0;
  32. }
  33. function isValidDigit(v){
  34. return isInt(v) && v >= defaultDecimal.min && v <= defaultDecimal.max;
  35. }
  36. //newV用户可编辑数据
  37. function toUpdateDecimal(orgV, newV){
  38. let rst = false;
  39. let len = Object.keys(newV).length;
  40. reCompare(orgV, newV);
  41. function reCompare(orgV, newV){
  42. for(let attr in newV){
  43. if(Object.keys(newV[attr]).length > 0){
  44. if(isUndef(orgV[attr])){
  45. rst = true;
  46. return;
  47. }
  48. else{
  49. reCompare(orgV[attr], newV[attr]);
  50. }
  51. }
  52. else {
  53. if(isUndef(orgV[attr]) || parseInt(newV[attr]) !== parseInt(orgV[attr])){
  54. rst = true;
  55. return;
  56. }
  57. }
  58. }
  59. }
  60. return rst;
  61. }
  62. function setDecimal(_digits, data){
  63. if(isDef(data)){
  64. for(let attr in data){//设置入库的数据
  65. _digits[attr] = data[attr] || defaultDecimal['_def'][attr]['data'];
  66. }
  67. for(let attr in defaultDecimal['_def']){//设置不入库的数据
  68. if(!defaultDecimal['_def'][attr]['editable']){
  69. _digits[attr] = defaultDecimal['_def'][attr]['data'];
  70. }
  71. }
  72. }
  73. else {
  74. for(let attr in defaultDecimal['_def']){
  75. _digits[attr] = defaultDecimal['_def'][attr]['data'];
  76. }
  77. }
  78. }
  79. //获取decimalPanel中要展示的数据
  80. function m_getInitData(data){
  81. let rst = Object.create(null);
  82. for(let attr in defaultDecimal['_def']){
  83. if(defaultDecimal['_def'][attr]['editable'] && isDef(data[attr])){
  84. rst[attr] = data[attr];
  85. }
  86. }
  87. return rst;
  88. }
  89. //获取小数位数panel里的数据
  90. function m_getDecimalData(inputs){
  91. let rst = Object.create(null);
  92. for(let i = 0, len = inputs.length ; i < len; i++){
  93. let name = $(inputs[i]).attr('name');
  94. let attrs = name.split('-');
  95. if(attrs.length > 1){
  96. if(isUndef(rst[attrs[0]])){
  97. rst[attrs[0]] = Object.create(null);
  98. }
  99. if(isDef(rst[attrs[0]])) {
  100. rst[attrs[0]][attrs[1]] = parseInt($(inputs[i]).val());
  101. }
  102. }
  103. else {
  104. rst[attrs[0]] = parseInt($(inputs[i]).val());
  105. }
  106. }
  107. return rst;
  108. }
  109. function v_initPanel(data){
  110. if(this.isDef(data)){
  111. for(let attr in data){
  112. if(this.isObj(data[attr])){
  113. for(let subAttr in data[attr]){
  114. let str = attr + '-' + subAttr;
  115. let jqs = 'input[name="' + str + '"]';
  116. $(jqs).val(data[attr][subAttr]);
  117. $(jqs).attr('min', defaultDecimal.min);
  118. $(jqs).attr('max', defaultDecimal.max);
  119. }
  120. }
  121. else {
  122. let str = attr + '';
  123. let jqs = 'input[name="' + str + '"]';
  124. $(jqs).val(data[attr]);
  125. $(jqs).attr('min', defaultDecimal.min);
  126. $(jqs).attr('max', defaultDecimal.max);
  127. }
  128. }
  129. }
  130. }
  131. function e_validIn(inputs){
  132. for(let i = 0, len = inputs.length; i < len; i++){
  133. let orgV = $(inputs[i]).val();
  134. $(inputs[i]).keydown(function () {
  135. let v = $(this).val();
  136. if(v.trim().length > 0 && isValidDigit(v)){
  137. orgV = v;
  138. }
  139. });
  140. $(inputs[i]).keyup(function () {
  141. let v = $(this).val();
  142. if(v.trim().length === 0 || !isValidDigit(v)){
  143. alert('小数位数范围在0-6!');
  144. $(this).val(orgV);
  145. }
  146. else{
  147. //let newV = parseInt(v);
  148. }
  149. });
  150. }
  151. }
  152. function e_bindCof(btn){
  153. btn.bind('click', function () {
  154. //获取更新的数据
  155. let updateDecimal = m_getDecimalData($('input', '#poj-settings-decimal'));
  156. if(toUpdateDecimal(decimalObj, updateDecimal)){
  157. a_updateDigits(updateDecimal);
  158. }
  159. });
  160. }
  161. function e_unbindCof(btn){
  162. btn.unbind();
  163. }
  164. function a_updateDigits(updateDecimal){
  165. let url = '/pm/api/updateProjects';
  166. let data = {
  167. updateType: 'update',
  168. updateData: {
  169. ID: parseInt(scUrlUtil.GetQueryString('project')),
  170. 'property.decimal': updateDecimal
  171. }
  172. };
  173. let postData = {
  174. user_id: userID,
  175. updateData: [data]
  176. };
  177. let scCaller = function (resultData) {
  178. //update data
  179. setDecimal(decimalObj, updateDecimal);
  180. let v_data = m_getInitData(decimalObj);
  181. v_initPanel(v_data);
  182. console.log(decimalObj);
  183. };
  184. let errCaller = function () {
  185. alert('更新小数位数失败!');
  186. let v_data = m_getInitData(decimalObj);
  187. v_initPanel(v_data);
  188. };
  189. CommonAjax.post(url, postData, scCaller, errCaller);
  190. }
  191. $(document).ready(function () {
  192. $('#poj-set').on('shown.bs.modal', function (e) {
  193. let v_data = m_getInitData(decimalObj);
  194. v_initPanel(v_data);
  195. });
  196. //绑定确定按钮
  197. e_bindCof($('#property_ok'));
  198. //绑定小数位数输入控制
  199. e_validIn($('input', '#poj-settings-decimal'));
  200. });