quantity_detail_facade.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. /**
  2. * Created by chen on 2017/7/20.
  3. */
  4. /**
  5. * Created by chen on 2017/7/10.
  6. */
  7. let mongoose = require('mongoose');
  8. let consts = require('../../main/models/project_consts');
  9. let commonConsts = consts.commonConst;
  10. let _=require("lodash");
  11. let async_n = require("async");
  12. let quantity_detail_model = mongoose.model('quantity_detail');
  13. const uuidV1 = require('uuid/v1');
  14. module.exports={
  15. save:save,
  16. getData:getData
  17. };
  18. let operationMap={
  19. 'ut_create':create_quantity_detail,
  20. 'ut_update':update_quantity_detail,
  21. 'ut_delete':delete_quantity_detail
  22. };
  23. let updateFunctionMap = {
  24. 'normalUpdate':normalUpdate,
  25. 'updateQuantityRegex':updateQuantityRegex
  26. }
  27. function create_quantity_detail(user_id,datas) {
  28. return function (callback) {
  29. let doc = datas.doc;
  30. doc.ID = uuidV1();
  31. quantity_detail_model.create(doc,(err,result)=>{
  32. if(err){
  33. callback(err,null);
  34. }else {
  35. console.log(result);
  36. let returndata ={
  37. updateTpye:commonConsts.UT_CREATE,
  38. moduleName:consts.projectConst.QUANTITY_DETAIL,
  39. data:result
  40. }
  41. callback(null,returndata)
  42. }
  43. });
  44. }
  45. }
  46. function normalUpdate(user_id,datas) {
  47. return function(callback) {
  48. updateRecored(datas.query,datas.doc,callback);
  49. }
  50. }
  51. function updateQuantityRegex(user_id,datas) {
  52. return function(callback){
  53. console.log(datas);
  54. doRegexUpdate(datas).then(function (result) {
  55. console.log("update");
  56. callback(null,'');
  57. })
  58. /* let checkResult =checkingRegex(datas);
  59. if(checkResult!=null){
  60. callback(null,{
  61. moduleName:consts.projectConst.QUANTITY_DETAIL,
  62. err:{
  63. message:checkResult.message
  64. }
  65. });
  66. }else {
  67. updateRecored(datas.query,datas.doc,callback)
  68. }*/
  69. }
  70. }
  71. async function doRegexUpdate(datas) {
  72. if(datas.doc.regex==null){
  73. //update result and bill/ration records to null and refresh
  74. }else {
  75. try {
  76. let regex = datas.doc.regex.toUpperCase();
  77. let referenceIndexs = datas.doc.referenceIndexs;
  78. let detailList = await quantity_detail_model.find({'projectID':datas.query.projectID,'rationID':datas.query.rationID}).sort('seq').exec();
  79. let result =getEvalResult(referenceIndexs,detailList,regex);
  80. detailList[datas.query.index].result =result;
  81. detailList[datas.query.index].regex=datas.doc.regex;
  82. let updateTasks =[];
  83. datas.doc.result=result;
  84. updateTasks.push({
  85. query:{
  86. ID:datas.query.ID,
  87. projectID:datas.query.projectID
  88. },
  89. doc:datas.doc
  90. })
  91. for(let d of detailList){
  92. if(_.includes(d.referenceIndexs,datas.query.index+1)){
  93. let tResult = getEvalResult(d.referenceIndexs,detailList,d.regex);
  94. let t = {
  95. query:{
  96. ID:d.ID,
  97. projectID:d.projectID
  98. },
  99. doc:{
  100. result:tResult
  101. }
  102. };
  103. updateTasks.push(t);
  104. }
  105. }
  106. let updateEdit = await quantity_detail_model.bulkWrite(generateUpdateTaks(updateTasks));
  107. console.log(updateEdit);
  108. return regex;
  109. }catch (error){
  110. console.log(error);
  111. }
  112. }
  113. }
  114. function getEvalResult(referenceIndexs,detailList,regex) {
  115. for(let i of referenceIndexs){
  116. regex = replaceReference(i,detailList,regex)
  117. }
  118. console.log('replace all C reference -----'+regex);
  119. regex =replaceSqr(regex);
  120. console.log('replace all sqar reference -----'+regex);
  121. return eval(regex);
  122. }
  123. function generateUpdateTaks(updateTasks) {
  124. var tasks=[];
  125. for(let u of updateTasks){
  126. let t ={
  127. updateOne:{
  128. filter:u.query,
  129. update: u.doc
  130. }
  131. }
  132. tasks.push(t);
  133. }
  134. return tasks;
  135. }
  136. function replaceReference(index,detailList,str) {
  137. str=str.toUpperCase();
  138. str=replaceAll('C'+index,'('+detailList[index-1].regex+')',str);
  139. if(detailList[index-1].referenceIndexs.length>0){
  140. for (let i of detailList[index-1].referenceIndexs){
  141. str =replaceReference(i,detailList,str);
  142. }
  143. }
  144. return str;
  145. }
  146. function replaceAll (FindText, RepText,str) {
  147. let regExp = new RegExp(FindText, "g");
  148. return str.replace(regExp, RepText);
  149. }
  150. function replaceSqr(text) {
  151. var squarRegex = /\([^\^]+\)\^\d+/g;
  152. var sqararr = text.match(squarRegex);
  153. var squarRegex2 = /C[0-9]+\^\d+|[0-9]+([.]{1}[0-9]+){0,1}\^\d+/g; //匹配没有括号的
  154. var sqararr2=text.match(squarRegex2);
  155. if(sqararr){
  156. text=converSqrByArr(sqararr,text);
  157. }
  158. if(sqararr2){
  159. text=converSqrByArr(sqararr2,text);
  160. }
  161. return text;
  162. }
  163. function converSqrByArr (sqararr,text) {
  164. var temp = text;
  165. sqararr.forEach(function (item) {
  166. var arr = item.split('\^');
  167. var y = parseInt(arr[1]);
  168. var x_arr = [];
  169. for (var i = 0; i < y; i++) {
  170. x_arr.push(arr[0]);
  171. }
  172. var temStr = x_arr.join('*');
  173. temp = temp.replace(item, temStr);
  174. });
  175. return temp;
  176. };
  177. function updateRecored(query,doc,callback) {
  178. quantity_detail_model.update(query,doc,(err,result)=>{
  179. if(err){
  180. callback(err,'');
  181. }else {
  182. let returndata ={
  183. moduleName:consts.projectConst.QUANTITY_DETAIL,
  184. data:{
  185. updateTpye:commonConsts.UT_UPDATE,
  186. query:query,
  187. doc:doc
  188. }
  189. }
  190. callback(null,returndata);
  191. }
  192. })
  193. }
  194. function checkingRegex(datas) {
  195. try{
  196. if(datas.doc.hasOwnProperty('regex')){
  197. // datas.doc.result=eval(datas.doc.regex);
  198. }
  199. return null;
  200. }catch (error){
  201. console.log(error.message);
  202. return error
  203. }
  204. }
  205. function update_quantity_detail(user_id,datas) {
  206. if(datas.updateFunction){
  207. return updateFunctionMap[datas.updateFunction](user_id,datas);
  208. }else {
  209. return normalUpdate(user_id,datas);
  210. }
  211. }
  212. function delete_quantity_detail(user_id,datas) {
  213. return function (callback) {
  214. callback(null,'');
  215. }
  216. }
  217. function getData(projectID, callback) {
  218. quantity_detail_model.find({'projectID':projectID}).sort('seq').exec((err,datas)=>{
  219. if(err){
  220. callback(1, '', null);
  221. }else {
  222. callback(0, consts.projectConst.QUANTITY_DETAIL, datas);
  223. }
  224. })
  225. }
  226. function save (user_id, datas, callback) {
  227. let operations=[];
  228. if(_.isArray(datas)){
  229. for(let i=0;i<datas.length;i++){
  230. operations.push(operationMap[datas[i].updateType](user_id,datas[i]));
  231. }
  232. }else {
  233. operations.push(operationMap[datas.updateType](user_id,datas));
  234. }
  235. async_n.parallel(operations,function (err,results) {
  236. if(err){
  237. callback(err,'');
  238. }else {
  239. if(results.length==1){
  240. callback(null,results[0])
  241. }else {
  242. callback(null,results)
  243. }
  244. }
  245. })
  246. }