glj.js 88 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754
  1. /**
  2. * Created by Zhong on 2017/8/14.
  3. */
  4. const locked = lockUtil.getLocked();
  5. const digital = {
  6. basePrice: -2,
  7. consumeAmt: -3,
  8. };
  9. let pageOprObj = {
  10. gljLibName: null,
  11. gljLibId: null,
  12. initPage: function (container, containerComponent, containerC) {
  13. let me = this,
  14. gljLibId = getQueryString("gljLibId"); //获取定额库参数
  15. me.gljLibId = gljLibId;
  16. //生成人材机表格列头
  17. repositoryGljObj.setting.header =
  18. repositoryGljObj.initHeaders(priceProperties);
  19. //生成列映射
  20. sheetCommonObj.initColMapping(
  21. repositoryGljObj,
  22. repositoryGljObj.setting.header
  23. );
  24. //生成单价列下标数组
  25. repositoryGljObj.initPriceCols(
  26. priceProperties,
  27. repositoryGljObj.colMapping
  28. );
  29. repositoryGljObj.getGljLib(gljLibId, function () {
  30. repositoryGljObj.buildSheet(container);
  31. gljComponentOprObj.buildSheet(containerComponent);
  32. componentOprObj.buildSheet(containerC);
  33. //获得定额库中引用此工料机库中的,所有被定额所套的工料机的ID
  34. //repositoryGljObj.getRationGljIds(gljLibId);
  35. repositoryGljObj.getGljDistType(function () {
  36. repositoryGljObj.currentRepositoryId = parseInt(gljLibId);
  37. repositoryGljObj.getGljItems(gljLibId, function () {
  38. gljClassTreeObj.getGljClassTree(gljLibId, function () {
  39. const spreads = [
  40. gljClassTreeObj.workBook,
  41. repositoryGljObj.workBook,
  42. gljComponentOprObj.workBook,
  43. ];
  44. const $range = $(document.body);
  45. lockUtil.lockSpreadsAndTools(spreads, $range, locked);
  46. });
  47. });
  48. });
  49. });
  50. },
  51. };
  52. let repositoryGljObj = {
  53. colMapping: null,
  54. treeObj: null,
  55. workBook: null,
  56. gljCurTypeId: -1,
  57. gljCurClassSeq: 0,
  58. currentRepositoryId: -1,
  59. currentCache: null,
  60. parentNodeIds: {},
  61. gljList: [],
  62. materialType: {
  63. textArr: ["钢材", "钢筋", "木材", "水泥", "商品砼", "商品砂浆"],
  64. comboItems: [
  65. { text: "钢材", value: 1 },
  66. { text: "钢筋", value: 2 },
  67. { text: "木材", value: 3 }, //三材类型:钢材1、钢筋2、木材3、水泥4、商品砼5、商品砂浆6
  68. { text: "水泥", value: 4 },
  69. { text: "商品砼", value: 5 },
  70. { text: "商品砂浆", value: 6 },
  71. ],
  72. },
  73. materialTypeIdx: {
  74. 1: "钢材",
  75. 2: "钢筋",
  76. 3: "木材",
  77. 4: "水泥",
  78. 5: "商品砼",
  79. 6: "商品砂浆",
  80. },
  81. machineModel: {
  82. textArr: ["特", "大", "中", "小"],
  83. comboItems: [
  84. { text: "特", value: 1 },
  85. { text: "大", value: 2 },
  86. { text: "中", value: 3 },
  87. { text: "小", value: 4 },
  88. ],
  89. },
  90. machineModelIdx: { 1: "特", 2: "大", 3: "中", 4: "小" },
  91. taxRateTypes: [201, 205, 206, 302, 4, 5],
  92. distTypeTree: null, //add
  93. setting: {
  94. owner: "glj",
  95. header: [
  96. // 默认情况下这个header会在initHeaders方法中被追加到全的头部中,可能也会被一些费用定额覆盖
  97. {
  98. headerName: "调整系数",
  99. headerWidth: 60,
  100. dataCode: "adjCoe",
  101. dataType: "Number",
  102. hAlign: "center",
  103. vAlign: "center",
  104. },
  105. {
  106. headerName: "三材类别",
  107. headerWidth: 90,
  108. dataCode: "materialType",
  109. dataType: "String",
  110. hAlign: "center",
  111. vAlign: "center",
  112. },
  113. {
  114. headerName: "三材系数",
  115. headerWidth: 60,
  116. dataCode: "materialCoe",
  117. dataType: "Number",
  118. hAlign: "center",
  119. vAlign: "center",
  120. },
  121. {
  122. headerName: "机型",
  123. headerWidth: 60,
  124. dataCode: "model",
  125. dataType: "Number",
  126. hAlign: "center",
  127. vAlign: "center",
  128. },
  129. {
  130. headerName: "工料指标类别",
  131. headerWidth: 90,
  132. dataCode: "materialIndexType",
  133. dataType: "String",
  134. hAlign: "center",
  135. vAlign: "center",
  136. },
  137. {
  138. headerName: "工料指标单位",
  139. headerWidth: 90,
  140. dataCode: "materialIndexUnit",
  141. dataType: "String",
  142. hAlign: "center",
  143. vAlign: "center",
  144. },
  145. {
  146. headerName: "单位转换系数",
  147. headerWidth: 90,
  148. dataCode: "materialIndexCoe",
  149. dataType: "Number",
  150. hAlign: "center",
  151. vAlign: "center",
  152. },
  153. ],
  154. view: {
  155. comboBox: [{ row: -1, col: 3, rowCount: -1, colCount: 1 }],
  156. lockedCells: [],
  157. },
  158. },
  159. //根据费用定额的单价属性获取人材机的单价属性
  160. getPriceProperty: function (priceProperties) {
  161. let priceProperty = {};
  162. for (let priceProp of priceProperties) {
  163. priceProperty[priceProp.price.dataCode] = 0;
  164. }
  165. return priceProperty;
  166. },
  167. //根据单价字段获取消耗量字段
  168. getConsumeAmtField: function (consumeAmtProperties, priceField) {
  169. if (!consumeAmtProperties || consumeAmtProperties.length === 0) {
  170. return "consumeAmt";
  171. }
  172. for (let consumeAmtProp of consumeAmtProperties) {
  173. if (consumeAmtProp.consumeAmt.refPrice === priceField) {
  174. return consumeAmtProp.consumeAmt.dataCode;
  175. }
  176. }
  177. return "consumeAmt";
  178. },
  179. //初始单价相关的列(单价列、单价属性列)
  180. initPriceCols: function (priceProperties, colMapping) {
  181. let priceCols = [],
  182. pricePropertyCols = [];
  183. if (!priceProperties || priceProperties.length === 0) {
  184. priceCols.push(colMapping.fieldToCol["basePrice"]);
  185. }
  186. for (let priceProp of priceProperties) {
  187. pricePropertyCols.push(colMapping.fieldToCol[priceProp.price.dataCode]);
  188. priceCols.push(colMapping.fieldToCol[priceProp.price.dataCode]);
  189. }
  190. this.priceCols = priceCols;
  191. this.pricePropertyCols = pricePropertyCols;
  192. },
  193. getPriceFields: function () {
  194. let rst = [];
  195. for (let priceCol of this.priceCols) {
  196. rst.push(this.colMapping.colToField[priceCol]);
  197. }
  198. return rst;
  199. },
  200. //获取更新定额价的人材机价格(人材机只有一个单价取basePrice, 人材机有多个单价,取第一个单价)
  201. getRationGljPrice: function (glj) {
  202. if (glj.priceProperty) {
  203. let keys = Object.keys(glj.priceProperty);
  204. if (keys.length > 0) {
  205. return glj.priceProperty[keys[0]];
  206. }
  207. }
  208. return glj.basePrice;
  209. },
  210. //生成列头(多单价)
  211. initHeaders: function (priceProperties) {
  212. let headers = [
  213. {
  214. headerName: "编码",
  215. headerWidth: 80,
  216. dataCode: "code",
  217. dataType: "String",
  218. formatter: "@",
  219. hAlign: "left",
  220. vAlign: "center",
  221. },
  222. {
  223. headerName: "名称",
  224. headerWidth: 160,
  225. dataCode: "name",
  226. dataType: "String",
  227. formatter: "@",
  228. hAlign: "left",
  229. vAlign: "center",
  230. },
  231. {
  232. headerName: "规格型号",
  233. headerWidth: 80,
  234. dataCode: "specs",
  235. dataType: "String",
  236. formatter: "@",
  237. hAlign: "left",
  238. vAlign: "center",
  239. },
  240. {
  241. headerName: "单位",
  242. headerWidth: 60,
  243. dataCode: "unit",
  244. dataType: "String",
  245. hAlign: "center",
  246. vAlign: "center",
  247. },
  248. {
  249. headerName: "类型",
  250. headerWidth: 90,
  251. dataCode: "gljType",
  252. dataType: "String",
  253. hAlign: "center",
  254. vAlign: "center",
  255. },
  256. ];
  257. //生成单价列
  258. if (!priceProperties || priceProperties.length === 0) {
  259. headers.push({
  260. headerName: "定额价",
  261. headerWidth: 80,
  262. dataCode: "basePrice",
  263. dataType: "Number",
  264. formatter: "0.00",
  265. hAlign: "right",
  266. vAlign: "center",
  267. });
  268. } else {
  269. for (let priceProp of priceProperties) {
  270. let colData = {
  271. headerName: priceProp.price.dataName,
  272. headerWidth: 100,
  273. dataCode: priceProp.price.dataCode,
  274. dataType: "Number",
  275. formatter: "0.00",
  276. hAlign: "right",
  277. vAlign: "center",
  278. };
  279. headers.push(colData);
  280. }
  281. }
  282. headers.push({
  283. headerName: "损耗率",
  284. headerWidth: 90,
  285. dataCode: "lossRate",
  286. dataType: "Number",
  287. hAlign: "center",
  288. vAlign: "center",
  289. });
  290. /* let tailHeaders = [
  291. {headerName:"调整系数",headerWidth:60,dataCode:"adjCoe", dataType: "Number", hAlign: "center", vAlign: "center"},
  292. {headerName:"三材类别",headerWidth:90,dataCode:"materialType", dataType: "String", hAlign: "center", vAlign: "center"},
  293. {headerName:"三材系数",headerWidth:60,dataCode:"materialCoe", dataType: "Number", hAlign: "center", vAlign: "center"},
  294. {headerName:"机型",headerWidth:60,dataCode:"model", dataType: "Number", hAlign: "center", vAlign: "center"},
  295. {headerName:"工料指标类别",headerWidth:90,dataCode:"materialIndexType", dataType: "String", hAlign: "center", vAlign: "center"},
  296. {headerName:"工料指标单位",headerWidth:90,dataCode:"materialIndexUnit", dataType: "String", hAlign: "center", vAlign: "center"},
  297. {headerName:"单位转换系数",headerWidth:90,dataCode:"materialIndexCoe", dataType: "Number", hAlign: "center", vAlign: "center"}
  298. ]; */
  299. headers = headers.concat(this.setting.header);
  300. return headers;
  301. },
  302. //工料机单价赋初始值(没有单价属性,则单价字段为basePrice,否则单价字段为单价属性对象中的属性)
  303. initPrice: function (glj) {
  304. if (!priceProperties || priceProperties.length === 0) {
  305. glj.basePrice =
  306. glj.basePrice && !isNaN(parseFloat(glj.basePrice))
  307. ? scMathUtil.roundTo(parseFloat(glj.basePrice), -2)
  308. : 0;
  309. } else {
  310. if (!glj.priceProperty) {
  311. glj.priceProperty = {};
  312. }
  313. for (let priceProp of priceProperties) {
  314. let gljPrice = glj["priceProperty"][priceProp.price.dataCode];
  315. gljPrice =
  316. gljPrice && !isNaN(parseFloat(gljPrice))
  317. ? scMathUtil.roundTo(parseFloat(gljPrice), -2)
  318. : 0;
  319. }
  320. }
  321. },
  322. //人材机单价是否变化
  323. isGljPriceChange: function (glj, newPrice) {
  324. //多单价,与人材机单价属性比较
  325. if (typeof newPrice === "object") {
  326. return !_.isEqual(glj.priceProperty, newPrice);
  327. }
  328. return !_.isEqual(glj.basePrice, newPrice);
  329. },
  330. //粘贴数据含有单价
  331. pasteIncludesPrice: function (pasteObj) {
  332. let me = repositoryGljObj;
  333. for (let priceCol of me.priceCols) {
  334. let priceField = me.colMapping.colToField[priceCol];
  335. if (typeof pasteObj[priceField] !== "undefined") {
  336. return true;
  337. }
  338. }
  339. return false;
  340. },
  341. //获取人材机价格
  342. getPrice: function (glj, col) {
  343. let me = repositoryGljObj;
  344. if (!priceProperties || priceProperties.length === 0) {
  345. return glj.basePrice;
  346. }
  347. return glj.priceProperty[me.colMapping.colToField[col]];
  348. },
  349. //工料机价格是否相同
  350. priceIsEqual: function (gljA, gljB) {
  351. if (!priceProperties || priceProperties.length === 0) {
  352. return gljA.basePrice == gljB.basePrice;
  353. }
  354. return _.isEqual(gljA.priceProperty, gljB.priceProperty);
  355. },
  356. setGljPrice: function (glj, newPrice, col) {
  357. if (!priceProperties || priceProperties.length === 0) {
  358. glj.basePrice = newPrice;
  359. } else {
  360. glj.priceProperty[this.colMapping.colToField[col]] = newPrice;
  361. }
  362. },
  363. setUnitCombo: function (sheet, headers) {
  364. let me = this;
  365. sheet.suspendPaint();
  366. sheet.suspendEvent();
  367. let combo = sheetCommonObj.getDynamicCombo();
  368. combo.items(rationAndGljUnits).itemHeight(10).editable(true);
  369. let unitCol = me.colMapping.fieldToCol["unit"];
  370. if (unitCol) {
  371. sheet.getRange(-1, unitCol, -1, 1).cellType(combo);
  372. }
  373. sheet.resumePaint();
  374. sheet.resumeEvent();
  375. },
  376. getComboData: function (gljDistType) {
  377. let me = this;
  378. let distType;
  379. let distTypeTree = {
  380. prefix: "gljType",
  381. distTypes: {},
  382. comboDatas: [],
  383. distTypesArr: [],
  384. };
  385. gljDistType.forEach(function (typeData) {
  386. let typeObj = {
  387. data: typeData,
  388. children: [],
  389. parent: null,
  390. };
  391. distTypeTree.distTypes[distTypeTree.prefix + typeData.ID] = typeObj;
  392. distTypeTree.distTypesArr.push(typeObj);
  393. });
  394. gljDistType.forEach(function (typeData) {
  395. distType = distTypeTree.distTypes[distTypeTree.prefix + typeData.ID];
  396. let parent =
  397. distTypeTree.distTypes[distTypeTree.prefix + typeData.ParentID];
  398. if (parent) {
  399. distType.parent = parent;
  400. parent.children.push(distType);
  401. }
  402. });
  403. distTypeTree.distTypesArr.forEach(function (distTypeObj) {
  404. if (allowGljType.includes(distTypeObj.data.ID)) {
  405. distTypeTree.comboDatas.push({
  406. text: distTypeObj.data.fullName,
  407. value: distTypeObj.data.ID,
  408. });
  409. }
  410. });
  411. return distTypeTree;
  412. },
  413. getGljDistType: function (callback) {
  414. let me = this;
  415. $.ajax({
  416. type: "post",
  417. url: "api/getGljDistType",
  418. dataType: "json",
  419. success: function (result) {
  420. if (!result.error && callback) {
  421. me.distTypeTree = me.getComboData(result.data);
  422. console.log(me.distTypeTree);
  423. callback();
  424. }
  425. },
  426. });
  427. },
  428. getGljLib: function (libId, callback) {
  429. let me = repositoryGljObj;
  430. $.ajax({
  431. type: "post",
  432. url: "api/getGljLib",
  433. data: { libId: libId },
  434. dataType: "json",
  435. success: function (result) {
  436. if (!result.error) {
  437. if (result.data.length > 0) {
  438. me.rationLibs = result.data[0].rationLibs;
  439. $(".navbar-text").append(
  440. "<a href='/stdGljRepository/main'>人材机库</a><i class='fa fa-angle-right fa-fw'></i>" +
  441. result.data[0].dispName
  442. );
  443. pageOprObj.gljLibName = result.data[0].dispName;
  444. }
  445. callback();
  446. }
  447. },
  448. });
  449. },
  450. getGljTree: function (gljLibId, callback) {
  451. let me = this;
  452. $.ajax({
  453. type: "POST",
  454. url: "api/getGljTree",
  455. data: { gljLibId: gljLibId },
  456. dataType: "json",
  457. cache: false,
  458. timeout: 20000,
  459. success: function (result, textStatus, status) {
  460. if (status.status == 200) {
  461. zTreeHelper.createTree(result.data, gljSetting, "repositoryTree", me);
  462. zTreeHelper.createTree(
  463. result.data,
  464. componentSetting,
  465. "componentTree",
  466. componentOprObj
  467. );
  468. if (result.data && result.data.length > 0) {
  469. me.gljCurTypeId = result.data[0].ID;
  470. me.gljCurClassSeq = result.data[0].classSeq;
  471. } else {
  472. //重新创建库?
  473. gljTypeTreeOprObj.addRootNode();
  474. }
  475. callback();
  476. }
  477. },
  478. error: function (err) {
  479. alert(err.responseJSON.error);
  480. },
  481. });
  482. },
  483. getGljItems: function (repId, callback) {
  484. let me = this;
  485. $.ajax({
  486. type: "POST",
  487. url: "api/getGljItems",
  488. data: { repositoryId: repId },
  489. dataType: "json",
  490. cache: false,
  491. timeout: 240000,
  492. success: function (result) {
  493. if (!result.error) {
  494. me.gljList = result.data;
  495. // test
  496. /*const temp = [];
  497. const map = {};
  498. me.gljList.forEach(glj => {
  499. if (!map[glj.code]) {
  500. map[glj.code] = 1;
  501. } else {
  502. temp.push(glj);
  503. }
  504. });
  505. temp.sort((a, b) => b.ID - a.ID);
  506. console.log(temp);*/
  507. // test
  508. me.workBook.getSheet(0).setRowCount(result.data.length);
  509. me.sortGlj();
  510. me.currentGlj = me.gljList.length > 0 ? me.gljList[0] : null; //初始
  511. if (callback) {
  512. callback();
  513. }
  514. }
  515. },
  516. error: function (err) {
  517. alert(err);
  518. },
  519. });
  520. },
  521. showGljItems: function (data, type) {
  522. let me = repositoryGljObj;
  523. if (me.workBook) {
  524. let cacheSection = data;
  525. me.sortGljDeep(cacheSection);
  526. sheetCommonObj.cleanData(me.workBook.getSheet(0), me.setting, -1);
  527. sheetsOprObj.showData(
  528. me,
  529. me.workBook.getSheet(0),
  530. me.setting,
  531. cacheSection,
  532. me.distTypeTree,
  533. me.materialTypeIdx,
  534. me.machineModelIdx
  535. );
  536. let gljTypeCol = me.colMapping.fieldToCol["gljType"],
  537. materialTypeCol = me.colMapping.fieldToCol["materialType"],
  538. modelCol = me.colMapping.fieldToCol["model"];
  539. sheetCommonObj.setDynamicCombo(
  540. me.workBook.getActiveSheet(),
  541. 0,
  542. gljTypeCol,
  543. me.workBook.getActiveSheet().getRowCount(),
  544. me.distTypeTree.comboDatas,
  545. 10,
  546. "text"
  547. );
  548. sheetCommonObj.setDynamicCombo(
  549. me.workBook.getActiveSheet(),
  550. 0,
  551. materialTypeCol,
  552. me.workBook.getActiveSheet().getRowCount(),
  553. me.materialType.comboItems,
  554. false,
  555. "text"
  556. );
  557. sheetCommonObj.setDynamicCombo(
  558. me.workBook.getActiveSheet(),
  559. 0,
  560. modelCol,
  561. me.workBook.getActiveSheet().getRowCount(),
  562. me.machineModel.comboItems,
  563. false,
  564. "text"
  565. );
  566. cacheSection = null;
  567. let selRow = me.workBook.getActiveSheet().getSelections()[0].row;
  568. me.initSel(selRow);
  569. }
  570. },
  571. bindEnterKey: function () {
  572. let me = this;
  573. let sheet = me.workBook.getActiveSheet();
  574. me.workBook.commandManager().register("myEnter", function () {
  575. let orgRow = sheet.getActiveRowIndex();
  576. let orgCol = sheet.getActiveColumnIndex();
  577. if (sheet.isEditing()) {
  578. sheet.endEdit();
  579. }
  580. let codeCol = me.colMapping.fieldToCol["code"];
  581. let code = sheet.getValue(orgRow, codeCol);
  582. let newRow, newCol;
  583. if (
  584. !me.currentCache[orgRow] &&
  585. code !== undefined &&
  586. code !== null &&
  587. orgCol !== me.setting.header.length - 1
  588. ) {
  589. newRow = orgRow;
  590. newCol = orgCol + 1;
  591. sheet.setActiveCell(newRow, newCol);
  592. } else {
  593. newRow = orgRow + 1;
  594. newCol = me.currentCache[orgRow + 1] ? orgCol : 0;
  595. sheet.setActiveCell(newRow, newCol);
  596. }
  597. //触发事件
  598. me.onLeaveCell(
  599. { type: "LeaveCell" },
  600. {
  601. sheet: sheet,
  602. sheetName: sheet.name(),
  603. cancel: false,
  604. row: orgRow,
  605. col: orgCol,
  606. }
  607. );
  608. me.onEnterCell(
  609. { type: "EnterCell" },
  610. {
  611. sheet: sheet,
  612. sheetName: sheet.name(),
  613. cancel: false,
  614. row: newRow,
  615. col: newCol,
  616. }
  617. );
  618. let newSels = [{ row: newRow, rowCount: 1, col: newCol, colCount: 1 }];
  619. let oldSels = [{ row: orgRow, rowCount: 1, col: orgRow, colCount: 1 }];
  620. me.onSelectionChanged(
  621. { type: "SelectionChanged" },
  622. {
  623. sheet: sheet,
  624. sheetName: sheet.name(),
  625. newSelections: newSels,
  626. oldSelections: oldSels,
  627. }
  628. );
  629. });
  630. me.workBook
  631. .commandManager()
  632. .setShortcutKey(
  633. null,
  634. GC.Spread.Commands.Key.enter,
  635. false,
  636. false,
  637. false,
  638. false
  639. );
  640. me.workBook
  641. .commandManager()
  642. .setShortcutKey(
  643. "myEnter",
  644. GC.Spread.Commands.Key.enter,
  645. false,
  646. false,
  647. false,
  648. false
  649. );
  650. },
  651. buildSheet: function (container) {
  652. let me = repositoryGljObj;
  653. me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30, me);
  654. sheetCommonObj.bindEscKey(me.workBook, [
  655. {
  656. sheet: me.workBook.getSheet(0),
  657. editStarting: me.onCellEditStart,
  658. editEnded: me.onCellEditEnd,
  659. },
  660. ]);
  661. me.bindEnterKey();
  662. me.repositoryGljDelOpr();
  663. me.onContextmenuOpr();
  664. me.setUnitCombo(me.workBook.getActiveSheet(), me.setting.header);
  665. me.workBook.bind(
  666. GC.Spread.Sheets.Events.ClipboardPasting,
  667. me.onClipboardPasting
  668. );
  669. me.workBook.bind(
  670. GC.Spread.Sheets.Events.ClipboardPasted,
  671. me.onClipboardPasted
  672. );
  673. if (priceProperties && priceProperties.length > 0) {
  674. me.workBook.getSheet(0).frozenColumnCount(5);
  675. }
  676. me.workBook
  677. .getSheet(0)
  678. .bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);
  679. me.workBook
  680. .getSheet(0)
  681. .bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);
  682. me.workBook
  683. .getSheet(0)
  684. .bind(GC.Spread.Sheets.Events.EnterCell, me.onEnterCell);
  685. me.workBook
  686. .getSheet(0)
  687. .bind(GC.Spread.Sheets.Events.LeaveCell, me.onLeaveCell);
  688. me.workBook
  689. .getSheet(0)
  690. .bind(GC.Spread.Sheets.Events.SelectionChanged, me.onSelectionChanged);
  691. },
  692. isDef: function (v) {
  693. return v !== undefined && v !== null;
  694. },
  695. //成为了组成物,暂时只需要判断主材的
  696. isComponent: function (gljId, gljList) {
  697. for (let i = 0, len = gljList.length; i < len; i++) {
  698. let gljComponent = gljList[i].component;
  699. if (
  700. gljList[i].gljType === 4 &&
  701. this.isDef(gljComponent) &&
  702. gljComponent.length > 0
  703. ) {
  704. for (let j = 0, jLen = gljComponent.length; j < jLen; j++) {
  705. if (gljComponent[j].ID === gljId) {
  706. return true;
  707. }
  708. }
  709. }
  710. }
  711. return false;
  712. },
  713. getCurrentComponent: function (gljComponent, sort = false) {
  714. let me = repositoryGljObj,
  715. rst = [],
  716. IDCodeMapping = {};
  717. for (let i = 0; i < gljComponent.length; i++) {
  718. let obj = {};
  719. for (let j = 0; j < me.gljList.length; j++) {
  720. let specs = me.gljList[j].specs ? " " + me.gljList[j].specs : "";
  721. if (gljComponent[i].ID == me.gljList[j].ID) {
  722. obj.ID = me.gljList[j].ID;
  723. obj.code = me.gljList[j].code;
  724. obj.name = me.gljList[j].name + specs;
  725. obj.unit = me.gljList[j].unit;
  726. obj.basePrice = me.gljList[j].basePrice;
  727. obj.priceProperty = me.gljList[j].priceProperty
  728. ? me.gljList[j].priceProperty
  729. : {};
  730. obj.consumeAmt = gljComponent[i].consumeAmt;
  731. obj.consumeAmtProperty = gljComponent[i].consumeAmtProperty
  732. ? gljComponent[i].consumeAmtProperty
  733. : {};
  734. rst.push(obj);
  735. IDCodeMapping[obj.ID] = obj.code;
  736. }
  737. }
  738. }
  739. if (sort) {
  740. rst.sort(function (a, b) {
  741. let r = 0;
  742. if (a.code > b.code) r = 1;
  743. else if (a.code < b.code) r = -1;
  744. return r;
  745. });
  746. gljComponent.sort(function (a, b) {
  747. let aV = IDCodeMapping[a.ID],
  748. bV = IDCodeMapping[b.ID];
  749. if (aV > bV) {
  750. return 1;
  751. } else if (aV < bV) {
  752. return -1;
  753. }
  754. return 0;
  755. });
  756. }
  757. return rst;
  758. },
  759. //获得引用了组成物id为componentId的工料机,和重新变化组成物数组、重新计算单价
  760. getUpdateGljs: function (rObj, isDelete) {
  761. let me = repositoryGljObj,
  762. that = gljComponentOprObj,
  763. rst = { updateArr: [], updateBasePrcArr: [] };
  764. //改变单价,以便reCalGljBasePrc方法可行
  765. if (!isDelete) {
  766. for (let i = 0; i < me.gljList.length; i++) {
  767. if (me.gljList[i].ID === rObj.ID) {
  768. me.gljList[i].basePrice = rObj.basePrice;
  769. me.gljList[i].priceProperty = rObj.priceProperty
  770. ? rObj.priceProperty
  771. : {};
  772. break;
  773. }
  774. }
  775. }
  776. for (let i = 0; i < me.gljList.length; i++) {
  777. let thisComponent = me.gljList[i].component,
  778. isChange = false;
  779. for (let j = 0; j < thisComponent.length; j++) {
  780. if (thisComponent[j].ID === rObj.ID) {
  781. //删除
  782. isChange = true;
  783. if (isDelete) {
  784. thisComponent.splice(j--, 1);
  785. } else {
  786. break;
  787. }
  788. }
  789. }
  790. if (isChange) {
  791. //引用了此组成物
  792. rst.updateArr.push(me.gljList[i]);
  793. }
  794. }
  795. return rst;
  796. },
  797. reshowGljBasePrc: function (glj) {
  798. let me = repositoryGljObj;
  799. let cacheSection = me.currentCache;
  800. let sheet = me.workBook.getActiveSheet();
  801. let row = _.findIndex(cacheSection, { ID: glj.ID });
  802. sheet.suspendEvent();
  803. sheet.suspendPaint();
  804. for (let priceCol of me.priceCols) {
  805. sheet.setValue(row, priceCol, glj[me.colMapping.colToField[priceCol]]);
  806. }
  807. sheet.resumeEvent();
  808. sheet.resumePaint();
  809. },
  810. reSetGljBasePrc: function (gljs) {
  811. let me = repositoryGljObj;
  812. let cacheSection = me.currentCache;
  813. let sheet = me.workBook.getSheet(0);
  814. let basePriceCol = me.colMapping.fieldToCol["basePrice"];
  815. sheet.suspendPaint();
  816. sheet.suspendEvent();
  817. for (let i = 0; i < cacheSection.length; i++) {
  818. for (let glj of gljs) {
  819. if (glj.ID === cacheSection[i].ID) {
  820. for (let priceCol of me.priceCols) {
  821. sheet.setValue(
  822. i,
  823. priceCol,
  824. glj[me.colMapping.colToField[priceCol]]
  825. );
  826. }
  827. //sheet.setValue(i, basePriceCol, glj.basePrice);
  828. }
  829. }
  830. }
  831. sheet.resumePaint();
  832. sheet.resumeEvent();
  833. },
  834. initSel: function (row) {
  835. let me = repositoryGljObj,
  836. that = gljComponentOprObj;
  837. sheetCommonObj.cleanData(that.workBook.getSheet(0), that.setting, -1);
  838. //sheetCommonObj.cleanSheet(that.workBook.getSheet(0), that.setting, -1);
  839. me.workBook.focus(true);
  840. me.currentComponent = [];
  841. that.workBook.getSheet(0).setRowCount(10);
  842. if (row < me.currentCache.length) {
  843. //标记当前工料机
  844. me.currentGlj = me.currentCache[row];
  845. if (allowComponent.includes(me.currentCache[row].gljType)) {
  846. //展示数据
  847. if (me.currentGlj.component.length > 0) {
  848. me.currentComponent = me.getCurrentComponent(
  849. me.currentGlj.component,
  850. true
  851. );
  852. if (me.currentComponent.length > 0) {
  853. sheetsOprObj.showData(
  854. that,
  855. that.workBook.getSheet(0),
  856. that.setting,
  857. me.currentComponent
  858. );
  859. }
  860. }
  861. }
  862. } else {
  863. me.currentGlj = null;
  864. }
  865. },
  866. onSelectionChanged: function (sender, info) {
  867. let me = repositoryGljObj,
  868. that = gljComponentOprObj;
  869. //混凝土202、砂浆203、配合比204、机械3
  870. if (
  871. (info.oldSelections.length === 0 && info.newSelections.length > 0) ||
  872. info.oldSelections[0].row !== info.newSelections[0].row
  873. ) {
  874. let row = info.newSelections[0].row;
  875. me.initSel(row);
  876. }
  877. },
  878. onLeaveCell: function (sender, args) {
  879. let me = repositoryGljObj;
  880. me.lastCell = { row: args.row, col: args.col };
  881. },
  882. onEnterCell: function (sender, args) {
  883. let me = repositoryGljObj;
  884. let thisDataCode = me.setting.header[args.col].dataCode,
  885. lastDataCode = me.setting.header[me.lastCell.col].dataCode;
  886. if (
  887. thisDataCode === "unit" ||
  888. lastDataCode === "unit" ||
  889. thisDataCode === "gljType" ||
  890. lastDataCode === "gljType" ||
  891. thisDataCode === "materialType" ||
  892. lastDataCode === "materialType" ||
  893. thisDataCode === "model" ||
  894. lastDataCode === "model"
  895. ) {
  896. let rects = [];
  897. rects.push(args.sheet.getCellRect(args.row, args.col));
  898. if (me.lastCell) {
  899. rects.push(args.sheet.getCellRect(me.lastCell.row, me.lastCell.col));
  900. }
  901. for (let rect of rects) {
  902. args.sheet.repaint(rect);
  903. }
  904. //args.sheet.repaint();
  905. }
  906. me.cellRowIdx = args.row;
  907. let isHasData = false;
  908. if (me.addGljObj) {
  909. for (let i = 0; i < me.setting.header.length; i++) {
  910. if (me.addGljObj[me.setting.header[i].dataCode]) {
  911. isHasData = true;
  912. break;
  913. }
  914. }
  915. }
  916. if (isHasData) {
  917. if (me.editingRowIdx !== me.cellRowIdx) {
  918. let focusToCol;
  919. function getFocusToCol(me) {
  920. if (!me.addGljObj.code) {
  921. $("#alertGljTxt").text("编号不能为空,继续增加人材机?");
  922. return me.colMapping.fieldToCol["code"];
  923. } else if (!me.addGljObj.name) {
  924. $("#alertGljTxt").text("名称不能为空,继续增加人材机?");
  925. return me.colMapping.fieldToCol["name"];
  926. } else if (!me.addGljObj.gljType) {
  927. $("#alertGljTxt").text("类型不能为空,继续增加人材机?");
  928. return me.colMapping.fieldToCol["gljType"];
  929. } else {
  930. return -1;
  931. }
  932. }
  933. focusToCol = getFocusToCol(me);
  934. if (focusToCol !== -1) {
  935. $("#gljAlertBtn").click();
  936. $("#aleConfBtn").unbind("click");
  937. $("#aleConfBtn").bind("click", function () {
  938. me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
  939. me.workBook.focus(true);
  940. });
  941. $("#gljAleClose").click(function () {
  942. me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
  943. me.workBook.focus(true);
  944. });
  945. $("#aleCanceBtn").unbind("click");
  946. $("#aleCanceBtn").bind("click", function () {
  947. me.addGljObj = null;
  948. args.sheet.suspendEvent();
  949. args.sheet.suspendPaint();
  950. for (let col = 0; col < me.setting.header.length; col++) {
  951. if (col === 0) {
  952. me.workBook
  953. .getSheet(0)
  954. .getCell(me.editingRowIdx, 0)
  955. .formatter("@");
  956. }
  957. me.workBook.getSheet(0).getCell(me.editingRowIdx, col).value("");
  958. }
  959. me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, 0);
  960. me.workBook.focus(true);
  961. args.sheet.resumeEvent();
  962. args.sheet.resumePaint();
  963. });
  964. }
  965. }
  966. }
  967. },
  968. onCellEditStart: function (sender, args) {
  969. let me = repositoryGljObj;
  970. me.orgCode = me.workBook
  971. .getSheet(0)
  972. .getValue(args.row, me.colMapping.fieldToCol["code"]);
  973. let rObj = sheetsOprObj.combineRowData(
  974. me.workBook.getSheet(0),
  975. me.setting,
  976. args.row,
  977. me
  978. );
  979. if (me.prevent) {
  980. args.cancel = true;
  981. return;
  982. }
  983. me.currentEditingGlj = rObj;
  984. if (args.row < me.currentCache.length) {
  985. let dataCode = me.setting.header[args.col].dataCode;
  986. me.currentGlj = me.currentCache[args.row];
  987. if (
  988. dataCode === "code" ||
  989. (dataCode === "taxRate" &&
  990. !me.taxRateTypes.includes(me.currentGlj.gljType)) ||
  991. (dataCode === "adjCoe" &&
  992. me.currentGlj.gljType !== 1 &&
  993. me.currentGlj.gljType !== 303) ||
  994. (dataCode === "materialCoe" && !me.currentGlj.materialType) ||
  995. (dataCode === "model" && me.currentGlj.gljType !== 301)
  996. ) {
  997. args.cancel = true;
  998. } else {
  999. rObj.ID = me.currentGlj.ID;
  1000. rObj.gljClass = me.currentGlj.gljClass;
  1001. }
  1002. } else {
  1003. me.currentGlj = null;
  1004. }
  1005. },
  1006. dataChanged: function (objA, objB, col) {
  1007. let me = repositoryGljObj;
  1008. if (me.priceCols.includes(col)) {
  1009. if (!priceProperties || priceProperties.length === 0) {
  1010. return objA.basePrice !== objB.basePrice;
  1011. } else {
  1012. return (
  1013. objA.priceProperty[me.colMapping.colToField[col]] !==
  1014. objB.priceProperty[me.colMapping.colToField[col]]
  1015. );
  1016. }
  1017. }
  1018. return (
  1019. objA[me.colMapping.colToField[col]] !==
  1020. objB[[me.colMapping.colToField[col]]]
  1021. );
  1022. },
  1023. onCellEditEnd: function (sender, args) {
  1024. let me = repositoryGljObj,
  1025. that = gljComponentOprObj,
  1026. updateArr = [],
  1027. addArr = [],
  1028. updateBasePrcArr = [];
  1029. // 输入编号、名称、规格时,如果输入回车符或粘贴回车符,提交时应转换为空格。
  1030. let deESCFields = ["code", "name", "specs"];
  1031. if (deESCFields.includes(me.setting.header[args.col]["dataCode"])) {
  1032. args.editingText = me.isDef(args.editingText)
  1033. ? args.editingText.toString().replace(/[\r\n]/g, " ")
  1034. : "";
  1035. args.sheet.setValue(args.row, args.col, args.editingText);
  1036. }
  1037. let rObj = sheetsOprObj.combineRowData(
  1038. me.workBook.getSheet(0),
  1039. me.setting,
  1040. args.row,
  1041. me
  1042. );
  1043. me.editingRowIdx = args.row;
  1044. //rObj.basePrice = rObj.basePrice ? rObj.basePrice : 0;
  1045. me.initPrice(rObj);
  1046. //更新
  1047. if (me.currentEditingGlj["ID"] && me.currentGlj) {
  1048. rObj["ID"] = me.currentEditingGlj["ID"];
  1049. rObj.gljClass = me.currentEditingGlj.gljClass;
  1050. if (me.dataChanged(me.currentEditingGlj, rObj, args.col)) {
  1051. if (
  1052. rObj.code &&
  1053. rObj.name &&
  1054. rObj.gljType &&
  1055. rObj.code.toString().trim().length !== 0 &&
  1056. rObj.name.toString().trim().length !== 0 &&
  1057. rObj.gljType.toString().trim().length !== 0
  1058. ) {
  1059. if (rObj.gljType !== me.currentEditingGlj.gljType) {
  1060. //修改了工料机类型
  1061. if (!$("#typeAlert").is(":visible")) {
  1062. $("#typeAlert").modal("show");
  1063. }
  1064. $("#typeConfirm").unbind("click");
  1065. $("#typeConfirm").bind("click", function () {
  1066. $("#typeAlert").modal("hide");
  1067. if (me.currentGlj) {
  1068. me.currentGlj.component = [];
  1069. }
  1070. /*if(me.allowComponent.indexOf(rObj.gljType) !== -1){//更改成可添加组成物的类型,则将定额价设成零
  1071. rObj.basePrice = 0;
  1072. }*/
  1073. // 工料机类型不为普通材料、商品混凝土、商品砂浆、机械组成物、主材、设备时,清空税率
  1074. if (!me.taxRateTypes.includes(rObj.gljType)) {
  1075. rObj.taxRate = null;
  1076. }
  1077. //调整系数,工料机类型为人工和机上人工时,可输入整数
  1078. if (
  1079. (me.currentEditingGlj.gljType === 1 ||
  1080. me.currentEditingGlj.gljType === 303) &&
  1081. !(rObj.gljType === 1 || rObj.gljType === 303)
  1082. ) {
  1083. rObj.adjCoe = null;
  1084. }
  1085. //工料机类型不为机械台班时,清空机型
  1086. if (
  1087. me.currentEditingGlj.gljType === 301 &&
  1088. rObj.gljType !== 301 &&
  1089. me.currentEditingGlj.model
  1090. ) {
  1091. rObj.model = null;
  1092. }
  1093. if (
  1094. componentType.includes(me.currentEditingGlj.gljType) &&
  1095. !(
  1096. machineComponent.includes(me.currentEditingGlj.gljType) &&
  1097. machineComponent.includes(rObj.gljType)
  1098. ) &&
  1099. !(
  1100. materialComponent.includes(me.currentEditingGlj.gljType) &&
  1101. materialComponent.includes(rObj.gljType)
  1102. )
  1103. ) {
  1104. //修改了原本是组成物的工料机
  1105. //寻找所有引用了此组成物的工料机,并从组成物中删去此工料机,并重算单价
  1106. let updateGljs = me.getUpdateGljs(rObj, true);
  1107. if (
  1108. updateGljs.updateArr.length > 0 ||
  1109. updateGljs.updateBasePrcArr.length > 0
  1110. ) {
  1111. for (let i = 0; i < updateGljs.updateArr.length; i++) {
  1112. updateArr.push(updateGljs.updateArr[i]);
  1113. }
  1114. for (let i = 0; i < updateGljs.updateBasePrcArr.length; i++) {
  1115. updateArr.push(updateGljs.updateBasePrcArr[i]);
  1116. }
  1117. }
  1118. }
  1119. sheetCommonObj.cleanData(
  1120. that.workBook.getSheet(0),
  1121. that.setting,
  1122. 5
  1123. );
  1124. rObj.component = me.currentGlj.component;
  1125. updateArr.push(rObj);
  1126. me.mixUpdateRequest(updateArr, [], []);
  1127. });
  1128. $(".typeClose").unbind("click");
  1129. $(".typeClose").bind("click", function () {
  1130. args.sheet.setValue(
  1131. args.row,
  1132. args.col,
  1133. _.find(me.distTypeTree.comboDatas, {
  1134. value: me.currentGlj.gljType,
  1135. }).text
  1136. );
  1137. });
  1138. return;
  1139. } else if (rObj.taxRate !== me.currentEditingGlj.taxRate) {
  1140. if (isNaN(rObj.taxRate)) {
  1141. args.sheet.setValue(
  1142. args.row,
  1143. args.col,
  1144. me.currentEditingGlj.taxRate || ""
  1145. );
  1146. alert("税率只能输入数值!");
  1147. return;
  1148. }
  1149. rObj.taxRate = scMathUtil.roundTo(parseFloat(rObj.taxRate), -2);
  1150. } else if (rObj.adjCoe !== me.currentEditingGlj.adjCoe) {
  1151. //修改调整系数,整数控制
  1152. if (isNaN(rObj.adjCoe) || rObj.adjCoe % 1 !== 0) {
  1153. args.sheet.setValue(
  1154. args.row,
  1155. args.col,
  1156. me.currentEditingGlj.adjCoe ? me.currentEditingGlj.adjCoe : ""
  1157. );
  1158. alert("调整系数只能输入整数!");
  1159. return;
  1160. }
  1161. } else if (rObj.materialCoe !== me.currentEditingGlj.materialCoe) {
  1162. if (isNaN(rObj.materialCoe)) {
  1163. args.sheet.setValue(
  1164. args.row,
  1165. args.col,
  1166. me.currentEditingGlj.materialCoe
  1167. ? me.currentEditingGlj.materialCoe
  1168. : ""
  1169. );
  1170. alert("三材系数只能输入数值!");
  1171. return;
  1172. }
  1173. rObj.materialCoe = scMathUtil.roundTo(
  1174. parseFloat(rObj.materialCoe),
  1175. -5
  1176. );
  1177. } else if (rObj.lossRate !== me.currentEditingGlj.lossRate) {
  1178. if (isNaN(rObj.lossRate)) {
  1179. args.sheet.setValue(
  1180. args.row,
  1181. args.col,
  1182. me.currentEditingGlj.lossRate
  1183. ? me.currentEditingGlj.lossRate
  1184. : ""
  1185. );
  1186. alert("只能输入数值!");
  1187. return;
  1188. }
  1189. } else if (!me.priceIsEqual(rObj, me.currentEditingGlj)) {
  1190. //修改了单价,可修改单价的必为可成为组成物的
  1191. let rObjPrice = me.getPrice(rObj, args.col),
  1192. editingGljPrice = me.getPrice(me.currentEditingGlj, args.col);
  1193. //寻找所有引用了此组成物的工料机,并从组成物中删去此工料机,并重算单价
  1194. if (isNaN(parseFloat(rObjPrice))) {
  1195. alert("单价只能输入数值!");
  1196. args.sheet.setValue(
  1197. args.row,
  1198. args.col,
  1199. editingGljPrice ? editingGljPrice : 0
  1200. );
  1201. return;
  1202. }
  1203. me.setGljPrice(
  1204. rObj,
  1205. scMathUtil.roundTo(parseFloat(rObjPrice), -2),
  1206. args.col
  1207. );
  1208. let updateGljs = me.getUpdateGljs(rObj);
  1209. if (
  1210. updateGljs.updateArr.length > 0 ||
  1211. updateGljs.updateBasePrcArr.length > 0
  1212. ) {
  1213. for (let i = 0; i < updateGljs.updateArr.length; i++) {
  1214. updateArr.push(updateGljs.updateArr[i]);
  1215. }
  1216. for (let i = 0; i < updateGljs.updateBasePrcArr.length; i++) {
  1217. updateArr.push(updateGljs.updateBasePrcArr[i]);
  1218. }
  1219. }
  1220. }
  1221. rObj.component = me.currentGlj.component;
  1222. updateArr.push(rObj);
  1223. } else {
  1224. if (me.setting.header[args.col].dataCode === "gljType") {
  1225. let distTypeVal =
  1226. me.distTypeTree.distTypes[
  1227. me.distTypeTree.prefix +
  1228. me.currentEditingGlj[me.setting.header[args.col].dataCode]
  1229. ].data.fullName;
  1230. args.sheet.setValue(args.row, args.col, distTypeVal);
  1231. } else {
  1232. args.sheet.setValue(
  1233. args.row,
  1234. args.col,
  1235. me.currentEditingGlj[me.setting.header[args.col].dataCode]
  1236. );
  1237. }
  1238. }
  1239. }
  1240. if (!me.priceIsEqual(rObj, me.currentEditingGlj)) {
  1241. //update basePrice of ration when editting basePrice of glj
  1242. let gljType = -1;
  1243. let gljTypeParent =
  1244. me.distTypeTree.distTypes[
  1245. me.distTypeTree.prefix + me.currentEditingGlj.gljType
  1246. ].parent;
  1247. if (gljTypeParent && gljTypeParent.data.ID <= 3) {
  1248. gljType = gljTypeParent.data.ID;
  1249. }
  1250. if (!gljTypeParent && me.currentEditingGlj.gljType <= 3) {
  1251. gljType = me.currentEditingGlj.gljType;
  1252. }
  1253. let gljBasePrcObj = {
  1254. gljId: me.currentEditingGlj.ID,
  1255. gljType: gljType,
  1256. basePrice: me.getRationGljPrice(rObj),
  1257. };
  1258. if (gljBasePrcObj.gljType !== -1) {
  1259. updateBasePrcArr.push(gljBasePrcObj);
  1260. if (me.rationLibs.length > 0) {
  1261. //重算定额单价
  1262. me.updateRationBasePrcRq(updateBasePrcArr);
  1263. }
  1264. }
  1265. }
  1266. }
  1267. //新增
  1268. else {
  1269. if (typeof rObj.code !== "undefined") {
  1270. me.addGljObj = rObj;
  1271. let isCanSav = true;
  1272. if (!rObj.code || !rObj.name || !rObj.gljType) {
  1273. isCanSav = false;
  1274. }
  1275. if (isCanSav) {
  1276. me.addGljObj = null;
  1277. rObj.component = [];
  1278. //rObj.basePrice = !isNaN(parseFloat(rObj.basePrice)) && (rObj.basePrice && typeof rObj.basePrice !== 'undefined') ? scMathUtil.roundTo(parseFloat(rObj.basePrice), -2) : 0;
  1279. me.initPrice(rObj);
  1280. addArr.push(rObj);
  1281. }
  1282. }
  1283. }
  1284. if (!me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]) {
  1285. rObj.gljClass = me.gljCurTypeId;
  1286. rObj.classSeq = me.gljCurClassSeq;
  1287. }
  1288. if (updateArr.length > 0 || addArr.length > 0) {
  1289. me.currentEditingGlj = null;
  1290. me.mixUpdateRequest(updateArr, addArr, []);
  1291. }
  1292. },
  1293. delGljs: function (sels) {
  1294. let me = repositoryGljObj;
  1295. let sheet = me.workBook.getSheet(0),
  1296. updateArr = [],
  1297. removeArr = [],
  1298. removeIDs = [],
  1299. removeNames = [],
  1300. updateBasePrcArr = [], //删除基价单位后重新计算
  1301. canUpdate = false,
  1302. cacheSection = me.currentCache,
  1303. updateBackups = [];
  1304. if (sels.length > 0 && cacheSection.length > 0) {
  1305. for (let i = 0; i < sels.length; i++) {
  1306. if (sels[i].colCount === me.setting.header.length) {
  1307. for (let j = 0; j < sels[i].rowCount; j++) {
  1308. if (sels[i].row + j < cacheSection.length) {
  1309. removeArr.push(cacheSection[sels[i].row + j]);
  1310. removeIDs.push(cacheSection[sels[i].row + j].ID);
  1311. removeNames.push(cacheSection[sels[i].row + j].name);
  1312. //删除后重新计算引用了此工料机的定额单价
  1313. updateBasePrcArr.push({
  1314. gljId: cacheSection[sels[i].row + j].ID,
  1315. gljType: cacheSection[sels[i].row + j].gljType,
  1316. basePrice: 0,
  1317. delete: 1,
  1318. });
  1319. }
  1320. }
  1321. } else {
  1322. let maxCol = sels[i].col + sels[i].colCount - 1;
  1323. let cantNullDataCode = ["code", "name", "gljType"];
  1324. for (let j = 0; j < sels[i].rowCount; j++) {
  1325. if (sels[i].row + j < cacheSection.length) {
  1326. let updateObj = cacheSection[sels[i].row + j];
  1327. for (let col = sels[i].col; col <= maxCol; col++) {
  1328. let dataCode = me.setting.header[col].dataCode;
  1329. if (cantNullDataCode.includes(dataCode)) {
  1330. $("#alertText").text(
  1331. me.setting.header[col].headerName + "不可为空!"
  1332. );
  1333. $("#codeAlert").modal("show");
  1334. return false;
  1335. } else {
  1336. canUpdate = true;
  1337. break;
  1338. }
  1339. }
  1340. }
  1341. }
  1342. }
  1343. }
  1344. if (canUpdate) {
  1345. //删除警告
  1346. let upAlertText = "确认删除选中字段?";
  1347. $("#alertGljTxt").text(upAlertText);
  1348. $("#gljAlert").modal("show");
  1349. $("#aleConfBtn").unbind("click");
  1350. //确认
  1351. $("#aleConfBtn").bind("click", function () {
  1352. for (let i = 0; i < sels.length; i++) {
  1353. let maxCol = sels[i].col + sels[i].colCount - 1;
  1354. for (let j = 0; j < sels[i].rowCount; j++) {
  1355. if (sels[i].row + j < cacheSection.length) {
  1356. let updateObj = cacheSection[sels[i].row + j];
  1357. for (let col = sels[i].col; col <= maxCol; col++) {
  1358. let dataCode = me.setting.header[col].dataCode;
  1359. if (me.priceCols.includes(col)) {
  1360. me.setGljPrice(updateObj, 0, col);
  1361. updateBasePrcArr.push({
  1362. gljId: updateObj.ID,
  1363. gljType: updateObj.gljType,
  1364. basePrice: 0,
  1365. });
  1366. } else {
  1367. if (dataCode === "materialType") {
  1368. updateObj["materialCoe"] = null;
  1369. }
  1370. updateObj[dataCode] = "";
  1371. }
  1372. }
  1373. updateArr.push(updateObj);
  1374. }
  1375. }
  1376. }
  1377. me.mixUpdateRequest(updateArr, [], []);
  1378. if (updateBasePrcArr.length > 0 && me.rationLibs.length > 0) {
  1379. me.updateRationBasePrcRq(updateBasePrcArr);
  1380. }
  1381. });
  1382. }
  1383. if (removeArr.length > 0) {
  1384. $.bootstrapLoading.start();
  1385. CommonAjax.post(
  1386. "/stdGljRepository/api/isUsed",
  1387. { gljIds: removeIDs },
  1388. function (rstData) {
  1389. $.bootstrapLoading.end();
  1390. //存在被引用的人材机(标准/补充定额库)
  1391. if (rstData.isUsed) {
  1392. $("#gljAlert")
  1393. .find(".modal-body h5")
  1394. .text("已有定额引用了当前人材机,不可删除。");
  1395. $("#gljAlert").modal("show");
  1396. $("#aleConfBtn").unbind("click");
  1397. $("#aleConfBtn").bind("click", function () {
  1398. $("#gljAlert").modal("hide");
  1399. me.workBook.focus(true);
  1400. });
  1401. } else {
  1402. $("#gljAlert")
  1403. .find(".modal-body h5")
  1404. .text(`确定要删除人材机 “${removeNames.join(",")}” 吗? `);
  1405. setTimeout(function () {
  1406. $("#gljAlert").modal("show");
  1407. }, 200);
  1408. //确认
  1409. $("#aleConfBtn").unbind("click");
  1410. $("#aleConfBtn").bind("click", function () {
  1411. for (let removeD of removeArr) {
  1412. let updateGljs = me.getUpdateGljs(removeD, true);
  1413. if (updateGljs.updateArr.length > 0) {
  1414. for (let i = 0; i < updateGljs.updateArr.length; i++) {
  1415. updateArr.push(updateGljs.updateArr[i]);
  1416. }
  1417. }
  1418. }
  1419. me.mixUpdateRequest(updateArr, [], removeIDs);
  1420. /* if(updateBasePrcArr.length > 0 && me.rationLibs.length > 0){
  1421. me.updateRationBasePrcRq(updateBasePrcArr);
  1422. me.workBook.focus(true);
  1423. }*/
  1424. });
  1425. }
  1426. },
  1427. function () {
  1428. $.bootstrapLoading.end();
  1429. $("#gljAlert")
  1430. .find(".modal-body h5")
  1431. .text("查询引用错误,不可删除。");
  1432. $("#gljAlert").modal("show");
  1433. $("#aleConfBtn").unbind("click");
  1434. $("#aleConfBtn").bind("click", function () {
  1435. $("#gljAlert").modal("hide");
  1436. me.workBook.focus(true);
  1437. });
  1438. }
  1439. );
  1440. }
  1441. }
  1442. },
  1443. //删除人材机前需要判断人材机是否有被引用,被引用了则不可删除
  1444. repositoryGljDelOpr: function () {
  1445. if (locked) {
  1446. return;
  1447. }
  1448. let me = repositoryGljObj;
  1449. me.workBook.commandManager().register("repositoryGljDel", function () {
  1450. let sels = me.workBook.getActiveSheet().getSelections();
  1451. me.delGljs(sels);
  1452. });
  1453. me.workBook
  1454. .commandManager()
  1455. .setShortcutKey(
  1456. null,
  1457. GC.Spread.Commands.Key.del,
  1458. false,
  1459. false,
  1460. false,
  1461. false
  1462. );
  1463. me.workBook
  1464. .commandManager()
  1465. .setShortcutKey(
  1466. "repositoryGljDel",
  1467. GC.Spread.Commands.Key.del,
  1468. false,
  1469. false,
  1470. false,
  1471. false
  1472. );
  1473. },
  1474. onContextmenuOpr: function () {
  1475. let me = repositoryGljObj;
  1476. $.contextMenu({
  1477. selector: "#GLJListSheet",
  1478. build: function ($triggerElement, e) {
  1479. //控制允许右键菜单在哪个位置出现
  1480. let sheet = me.workBook.getSheet(0);
  1481. let offset = $("#GLJListSheet").offset(),
  1482. x = e.pageX - offset.left,
  1483. y = e.pageY - offset.top;
  1484. let target = sheet.hitTest(x, y);
  1485. let sel = sheet.getSelections()[0];
  1486. if (sel.row === -1) {
  1487. sel.row = 0;
  1488. }
  1489. if (sel.col === -1) {
  1490. sel.col = 0;
  1491. }
  1492. if (
  1493. target.hitTestType === 3 &&
  1494. typeof target.row !== "undefined" &&
  1495. typeof target.col !== "undefined"
  1496. ) {
  1497. //在表格内
  1498. me.initSel(target.row);
  1499. if (
  1500. sel.row > target.row ||
  1501. sel.row + sel.rowCount - 1 < target.row ||
  1502. sel.col > target.col ||
  1503. sel.col + sel.colCount - 1 < target.col
  1504. ) {
  1505. sheet.setActiveCell(target.row, target.col);
  1506. }
  1507. return {
  1508. callback: function () {},
  1509. items: {
  1510. delete: {
  1511. name: "删除",
  1512. disabled: function () {
  1513. return (
  1514. locked || !(me.currentCache && me.currentCache[target.row])
  1515. );
  1516. },
  1517. icon: "fa-remove",
  1518. callback: function (key, opt) {
  1519. let curSel = _.cloneDeep(sheet.getSelections()[0]);
  1520. curSel.colCount = me.setting.header.length;
  1521. me.delGljs([curSel]);
  1522. },
  1523. },
  1524. getReference: {
  1525. name: "查找引用",
  1526. disabled: function () {
  1527. return !(me.currentCache && me.currentCache[target.row]);
  1528. },
  1529. icon: "fa-search",
  1530. callback: function () {
  1531. const glj = me.currentCache[target.row];
  1532. me.getReference(glj);
  1533. },
  1534. },
  1535. moveTo: {
  1536. name: "移动分类至…",
  1537. disabled: function () {
  1538. return (
  1539. locked || !(me.currentCache && me.currentCache[target.row])
  1540. );
  1541. },
  1542. icon: "fa-exchange",
  1543. callback: function (key, opt) {
  1544. me.moveTo([]);
  1545. },
  1546. },
  1547. },
  1548. };
  1549. } else {
  1550. return false;
  1551. }
  1552. },
  1553. });
  1554. },
  1555. getReference: function (glj) {
  1556. const $info = $("#info");
  1557. const $infoBody = $("#infoBody");
  1558. $.bootstrapLoading.start();
  1559. CommonAjax.post(
  1560. "/stdGljRepository/api/getReference",
  1561. { repositoryId: glj.repositoryId, gljId: glj.ID },
  1562. function (info) {
  1563. const htmlArr = [];
  1564. if (!info || !Object.keys(info).length) {
  1565. htmlArr.push("<li>无引用数据</li>");
  1566. }
  1567. for (let libName in info) {
  1568. htmlArr.push(`<li class="list-title">${libName}</li>`);
  1569. const rations = info[libName];
  1570. const rationList = rations.map((ration) => {
  1571. if (ration.rationRepId) {
  1572. return `<li>
  1573. <span>${ration.code}</span>
  1574. <a target="_blank" href="/rationRepository/ration?repository=${ration.rationRepId}&locked=${locked}#${ration.code}">定位</a>
  1575. </li>`;
  1576. }
  1577. return `<li><span>${ration.code}</span></li>`;
  1578. });
  1579. htmlArr.push(...rationList);
  1580. }
  1581. $infoBody.html(htmlArr.join(""));
  1582. $info.modal("show");
  1583. $.bootstrapLoading.end();
  1584. },
  1585. function () {
  1586. $.bootstrapLoading.end();
  1587. }
  1588. );
  1589. },
  1590. moveTo: function () {
  1591. $("#moveToConfirm").prop("disabled", true);
  1592. $("#moveTo").modal("show");
  1593. },
  1594. validUpdateObj: function (pasteObj, rowIdx) {
  1595. let rst = { updateGlj: [], updateBasePrcArr: [] },
  1596. backUpObj = {},
  1597. me = repositoryGljObj,
  1598. that = gljComponentOprObj,
  1599. tempObj = me.currentCache[rowIdx],
  1600. reCalBasePrc = false,
  1601. isValid = true,
  1602. materialTypeValid = true;
  1603. //备份原始数据
  1604. for (let atr in tempObj) {
  1605. backUpObj[atr] = tempObj[atr];
  1606. }
  1607. if (typeof pasteObj.code !== "undefined") {
  1608. if (pasteObj.code.trim().length !== 0) {
  1609. let isExist = false;
  1610. for (let i = 0; i < me.gljList.length; i++) {
  1611. if (me.gljList[i].code === pasteObj.code) {
  1612. isExist = true;
  1613. break;
  1614. }
  1615. }
  1616. if (!isExist) {
  1617. tempObj.code = pasteObj.code;
  1618. } else isValid = false;
  1619. } else isValid = false;
  1620. }
  1621. if (typeof pasteObj.name !== "undefined") {
  1622. if (pasteObj.name.trim().length === 0) isValid = false;
  1623. else tempObj.name = pasteObj.name;
  1624. }
  1625. if (typeof pasteObj.specs !== "undefined") {
  1626. tempObj.specs = pasteObj.specs;
  1627. }
  1628. if (typeof pasteObj.unit !== "undefined") {
  1629. tempObj.unit = pasteObj.unit;
  1630. }
  1631. if (typeof pasteObj.gljType !== "undefined") {
  1632. let isExsit = false;
  1633. for (let i = 0; i < me.distTypeTree.comboDatas.length; i++) {
  1634. if (pasteObj.gljType === me.distTypeTree.comboDatas[i].text) {
  1635. pasteObj.gljType = me.distTypeTree.comboDatas[i].value;
  1636. isExsit = true;
  1637. if (
  1638. !me.taxRateTypes.includes(pasteObj.taxRate) &&
  1639. me.taxRateTypes.includes(tempObj.taxRate)
  1640. ) {
  1641. tempObj.taxRate = null;
  1642. }
  1643. //调整系数
  1644. if (pasteObj.gljType !== 1 && pasteObj.gljType !== 303) {
  1645. tempObj.adjCoe = null;
  1646. } else if (
  1647. (pasteObj.gljType === 1 || pasteObj.gljType === 303) &&
  1648. typeof pasteObj.adjCoe !== "undefined" &&
  1649. !isNaN(pasteObj.adjCoe) &&
  1650. pasteObj.adjCoe % 1 === 0
  1651. ) {
  1652. tempObj.adjCoe = pasteObj.adjCoe;
  1653. }
  1654. if (pasteObj.gljType !== 301 && tempObj.gljType === 301) {
  1655. tempObj.model = null;
  1656. }
  1657. if (
  1658. componentType.includes(tempObj.gljType) &&
  1659. //!(tempObj.gljType === 302 && pasteObj.gljType === 303) && !(tempObj.gljType === 303 && pasteObj.gljType === 302)){//修改了原本是组成物的工料机
  1660. !(
  1661. machineComponent.includes(tempObj.gljType) &&
  1662. machineComponent.includes(pasteObj.gljType)
  1663. ) &&
  1664. !(
  1665. materialComponent.includes(tempObj.gljType) &&
  1666. materialComponent.includes(pasteObj.gljType)
  1667. )
  1668. ) {
  1669. //修改了原本是组成物的工料机
  1670. //寻找所有引用了此组成物的工料机,并从组成物中删去此工料机,并重算单价
  1671. let updateGljs = me.getUpdateGljs(tempObj, true);
  1672. if (
  1673. updateGljs.updateArr.length > 0 ||
  1674. updateGljs.updateBasePrcArr.length > 0
  1675. ) {
  1676. for (let i = 0; i < updateGljs.updateArr.length; i++) {
  1677. rst.updateGlj.push(updateGljs.updateArr[i]);
  1678. }
  1679. for (let i = 0; i < updateGljs.updateBasePrcArr.length; i++) {
  1680. rst.updateBasePrcArr.push(updateGljs.updateBasePrcArr[i]);
  1681. }
  1682. }
  1683. }
  1684. tempObj.component =
  1685. tempObj.gljType === pasteObj.gljType ? tempObj.component : [];
  1686. /*if(me.allowComponent.indexOf(tempObj.gljType) !== -1){//更改成可含组成物的工料机类型,定额价设置为零
  1687. tempObj.basePrice = tempObj.gljType === me.distTypeTree.comboDatas[i].value ? tempObj.basePrice : 0;
  1688. }*/
  1689. tempObj.gljType = pasteObj.gljType;
  1690. tempObj.shortName =
  1691. me.distTypeTree.distTypes[
  1692. me.distTypeTree.prefix + tempObj.gljType
  1693. ].data.shortName;
  1694. break;
  1695. }
  1696. }
  1697. if (!isExsit) {
  1698. isValid = false;
  1699. }
  1700. }
  1701. if (
  1702. typeof pasteObj.taxRate !== "undefined" &&
  1703. typeof pasteObj.gljType === "undefined"
  1704. ) {
  1705. if (me.taxRateTypes.includes(tempObj.gljType)) {
  1706. tempObj.taxRate =
  1707. pasteObj.taxRate && !isNaN(pasteObj.taxRate)
  1708. ? scMathUtil.roundTo(parseFloat(pasteObj.taxRate), -2)
  1709. : null;
  1710. } else {
  1711. isValid = false;
  1712. }
  1713. }
  1714. if (
  1715. typeof pasteObj.adjCoe !== "undefined" &&
  1716. typeof pasteObj.gljType === "undefined"
  1717. ) {
  1718. if (
  1719. tempObj.gljType &&
  1720. (tempObj.gljType === 1 || tempObj.gljType === 303) &&
  1721. typeof pasteObj.adjCoe !== "undefined" &&
  1722. !isNaN(pasteObj.adjCoe) &&
  1723. pasteObj.adjCoe % 1 === 0
  1724. ) {
  1725. tempObj.adjCoe = pasteObj.adjCoe;
  1726. } else {
  1727. isValid = false;
  1728. }
  1729. }
  1730. //单价相关
  1731. if (me.pasteIncludesPrice(pasteObj)) {
  1732. if (!priceProperties || priceProperties.length === 0) {
  1733. pasteObj.basePrice =
  1734. pasteObj.basePrice && !isNaN(parseFloat(pasteObj.basePrice))
  1735. ? scMathUtil.roundTo(parseFloat(pasteObj.basePrice), -2)
  1736. : me.currentCache[rowIdx].basePrice;
  1737. if (pasteObj.basePrice !== me.currentCache[rowIdx].basePrice) {
  1738. reCalBasePrc = true;
  1739. tempObj.basePrice = pasteObj.basePrice;
  1740. }
  1741. } else {
  1742. //多单价粘贴
  1743. let pastePriceProperty = {};
  1744. let priceFields = me.getPriceFields();
  1745. for (let priceField of priceFields) {
  1746. if (
  1747. typeof pasteObj[priceField] !== "undefined" &&
  1748. pasteObj[priceField] &&
  1749. !isNaN(parseFloat(pasteObj[priceField]))
  1750. ) {
  1751. pastePriceProperty[priceField] = scMathUtil.roundTo(
  1752. parseFloat(pasteObj[priceField]),
  1753. -2
  1754. );
  1755. }
  1756. }
  1757. if (!me.priceIsEqual(tempObj, pasteObj)) {
  1758. reCalBasePrc = true;
  1759. //更新人材机单价
  1760. for (let priceField in pastePriceProperty) {
  1761. tempObj.priceProperty[priceField] = pastePriceProperty[priceField];
  1762. }
  1763. }
  1764. }
  1765. let updateGljs = me.getUpdateGljs(tempObj, false);
  1766. if (
  1767. updateGljs.updateArr.length > 0 ||
  1768. updateGljs.updateBasePrcArr.length > 0
  1769. ) {
  1770. for (let i = 0; i < updateGljs.updateArr.length; i++) {
  1771. rst.updateGlj.push(updateGljs.updateArr[i]);
  1772. }
  1773. for (let i = 0; i < updateGljs.updateBasePrcArr.length; i++) {
  1774. rst.updateBasePrcArr.push(updateGljs.updateBasePrcArr[i]);
  1775. }
  1776. }
  1777. }
  1778. if (typeof pasteObj.materialType !== "undefined") {
  1779. if (!me.materialType.textArr.includes(pasteObj.materialType)) {
  1780. isValid = false;
  1781. materialTypeValid = false;
  1782. } else {
  1783. me.materialType.comboItems.forEach(function (item) {
  1784. if (item.text === pasteObj.materialType) {
  1785. tempObj.materialType = item.value;
  1786. }
  1787. });
  1788. }
  1789. }
  1790. if (typeof pasteObj.materialCoe !== "undefined") {
  1791. if (
  1792. isNaN(pasteObj.materialCoe) ||
  1793. (!tempObj.materialType &&
  1794. (!pasteObj.materialType ||
  1795. !me.materialType.textArr.includes(pasteObj.materialType)))
  1796. ) {
  1797. tempObj.materialType = "";
  1798. tempObj.materialCoe = null;
  1799. isValid = false;
  1800. } else {
  1801. tempObj.materialCoe =
  1802. pasteObj.materialCoe !== ""
  1803. ? scMathUtil.roundTo(parseFloat(pasteObj.materialCoe), -5)
  1804. : null;
  1805. }
  1806. }
  1807. if (typeof pasteObj.model !== "undefined") {
  1808. if (!me.machineModel.textArr.includes(pasteObj.model)) {
  1809. isValid = false;
  1810. } else {
  1811. let existsModel = false;
  1812. if (
  1813. (typeof pasteObj.gljType !== "undefined" &&
  1814. pasteObj.gljType === 301) ||
  1815. (tempObj.gljType && tempObj.gljType === 301)
  1816. ) {
  1817. me.machineModel.comboItems.forEach(function (item) {
  1818. if (item.text === pasteObj.model) {
  1819. tempObj.model = item.value;
  1820. existsModel = true;
  1821. }
  1822. });
  1823. if (!existsModel) {
  1824. isValid = false;
  1825. }
  1826. } else {
  1827. isValid = false;
  1828. }
  1829. }
  1830. }
  1831. if (typeof pasteObj.materialIndexType !== "undefined") {
  1832. tempObj.materialIndexType = pasteObj.materialIndexType;
  1833. }
  1834. if (typeof pasteObj.materialIndexUnit !== "undefined") {
  1835. tempObj.materialIndexUnit = pasteObj.materialIndexUnit;
  1836. }
  1837. if (typeof pasteObj.materialIndexCoe !== "undefined") {
  1838. tempObj.materialIndexCoe = pasteObj.materialIndexCoe;
  1839. }
  1840. if (typeof pasteObj.lossRate !== "undefined" && !isNaN(pasteObj.lossRate)) {
  1841. tempObj.lossRate = pasteObj.lossRate;
  1842. }
  1843. if (isValid) {
  1844. rst.updateGlj.push(tempObj);
  1845. if (reCalBasePrc) {
  1846. //重新计算定额基价对象
  1847. let newReObj = {
  1848. gljId: tempObj.ID,
  1849. gljType: tempObj.gljType,
  1850. basePrice: me.getRationGljPrice(tempObj),
  1851. };
  1852. rst.updateBasePrcArr.push(newReObj);
  1853. }
  1854. } else {
  1855. for (let attr in backUpObj) {
  1856. tempObj[attr] = backUpObj[attr];
  1857. }
  1858. }
  1859. return rst;
  1860. },
  1861. //粘贴的数据是否是可添加的数据,只有含有编号,名称,类型才可添加
  1862. isValidObj: function (pasteObj) {
  1863. let me = repositoryGljObj;
  1864. if (
  1865. !(pasteObj.code && typeof pasteObj.code !== "undefined") ||
  1866. !(pasteObj.name && typeof pasteObj.name !== "undefined") ||
  1867. !(pasteObj.gljType && typeof pasteObj.gljType !== "undefined")
  1868. ) {
  1869. return false;
  1870. }
  1871. if (pasteObj.gljType && typeof pasteObj.gljType !== "undefined") {
  1872. let isExist = false;
  1873. for (let i = 0; i < me.distTypeTree.comboDatas.length; i++) {
  1874. if (me.distTypeTree.comboDatas[i].text === pasteObj.gljType) {
  1875. isExist = true;
  1876. pasteObj.gljType = me.distTypeTree.comboDatas[i].value;
  1877. pasteObj.shortName =
  1878. me.distTypeTree.distTypes[
  1879. me.distTypeTree.prefix + pasteObj.gljType
  1880. ].data.shortName;
  1881. break;
  1882. }
  1883. }
  1884. if (!isExist) {
  1885. return false;
  1886. }
  1887. }
  1888. if (pasteObj.code && typeof pasteObj.code !== "undefined") {
  1889. for (let i = 0; i < me.gljList.length; i++) {
  1890. if (me.gljList[i].code === pasteObj.code) {
  1891. return false;
  1892. }
  1893. }
  1894. }
  1895. if (
  1896. pasteObj.taxRate &&
  1897. (isNaN(pasteObj.taxRate) || !me.taxRateTypes.includes(pasteObj.gljType))
  1898. ) {
  1899. return false;
  1900. }
  1901. if (pasteObj.adjCoe && typeof pasteObj.adjCoe !== "undefined") {
  1902. if (isNaN(pasteObj.adjCoe) || pasteObj.adjCoe % 1 !== 0) {
  1903. return false;
  1904. }
  1905. }
  1906. if (pasteObj.materialType) {
  1907. if (!me.materialType.textArr.includes(pasteObj.materialType)) {
  1908. return false;
  1909. } else {
  1910. me.materialType.comboItems.forEach(function (item) {
  1911. if (item.text === pasteObj.materialType) {
  1912. pasteObj.materialType = item.value;
  1913. }
  1914. });
  1915. }
  1916. }
  1917. if (pasteObj.materialCoe) {
  1918. if (isNaN(pasteObj.materialCoe) || !pasteObj.materialType) {
  1919. return false;
  1920. }
  1921. }
  1922. if (typeof pasteObj.lossRate !== "undefined" && isNaN(pasteObj[feeCode])) {
  1923. return false;
  1924. }
  1925. if (typeof pasteObj.model !== "undefined" && pasteObj.model) {
  1926. if (
  1927. !me.machineModel.textArr.includes(pasteObj.model) ||
  1928. pasteObj.gljType !== 301
  1929. ) {
  1930. return false;
  1931. }
  1932. me.machineModel.comboItems.forEach(function (item) {
  1933. if (item.text === pasteObj.model) {
  1934. pasteObj.model = item.value;
  1935. }
  1936. });
  1937. }
  1938. if (!priceProperties || priceProperties.length === 0) {
  1939. pasteObj.basePrice =
  1940. !isNaN(parseFloat(pasteObj.basePrice)) &&
  1941. pasteObj.basePrice &&
  1942. typeof pasteObj.basePrice !== "undefined"
  1943. ? parseFloat(pasteObj.basePrice)
  1944. : 0;
  1945. } else {
  1946. let pastePriceProperty = {};
  1947. let priceFields = me.getPriceFields();
  1948. for (let priceField of priceFields) {
  1949. if (
  1950. typeof pasteObj[priceField] !== "undefined" &&
  1951. pasteObj[priceField] &&
  1952. !isNaN(parseFloat(pasteObj[priceField]))
  1953. ) {
  1954. pastePriceProperty[priceField] = scMathUtil.roundTo(
  1955. parseFloat(pasteObj[priceField]),
  1956. -2
  1957. );
  1958. } else {
  1959. pastePriceProperty[priceField] = 0;
  1960. }
  1961. }
  1962. pasteObj.priceProperty = pastePriceProperty;
  1963. }
  1964. //pasteObj.basePrice = !isNaN(parseFloat(pasteObj.basePrice)) && (pasteObj.basePrice && typeof pasteObj.basePrice !== 'undefined') ? parseFloat(pasteObj.basePrice) : 0;
  1965. if (!me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]) {
  1966. pasteObj.gljClass = me.gljCurTypeId;
  1967. pasteObj.classSeq = me.gljCurClassSeq;
  1968. }
  1969. return true;
  1970. },
  1971. canPasted: function (info) {
  1972. let rst = true;
  1973. let me = repositoryGljObj;
  1974. if (me.gljCurTypeId < 0) {
  1975. return false;
  1976. }
  1977. //粘贴的最大列下标不超过总列数
  1978. if (
  1979. info.cellRange.col + info.cellRange.colCount - 1 >
  1980. me.setting.header.length - 1
  1981. ) {
  1982. return false;
  1983. }
  1984. if (info.cellRange.row < me.currentCache.length) {
  1985. if (info.cellRange.col === 0) {
  1986. return false;
  1987. }
  1988. }
  1989. return rst;
  1990. },
  1991. onClipboardPasting: function (sender, args) {
  1992. let me = repositoryGljObj;
  1993. //复制的列数超过正确的列数,不可复制
  1994. if (me.prevent) {
  1995. args.cancel = true;
  1996. return;
  1997. }
  1998. if (!me.canPasted(args)) {
  1999. args.cancel = true;
  2000. }
  2001. },
  2002. onClipboardPasted: function (e, info) {
  2003. $.bootstrapLoading.start();
  2004. let me = repositoryGljObj;
  2005. let updateArr = [],
  2006. addArr = [];
  2007. let items = sheetCommonObj.analyzePasteData(me.setting, info);
  2008. let beginRow = info.cellRange.row,
  2009. endRow = info.cellRange.row + info.cellRange.rowCount - 1,
  2010. maxRow = me.currentCache.length - 1,
  2011. updateBasePrcArr = [],
  2012. updateCount,
  2013. resumeArr = [];
  2014. if (endRow <= maxRow) {
  2015. //updateItems = items;
  2016. for (let i = 0; i < items.length; i++) {
  2017. let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
  2018. if (
  2019. updateObj &&
  2020. typeof updateObj.updateGlj !== "undefined" &&
  2021. updateObj.updateGlj.length > 0
  2022. ) {
  2023. //updateArr = updateObj.updateGlj;
  2024. updateArr = updateArr.concat(updateObj.updateGlj);
  2025. if (typeof updateObj.updateBasePrcArr !== "undefined") {
  2026. //updateBasePrcArr = updateObj.updateBasePrc;
  2027. updateBasePrcArr = updateBasePrcArr.concat(
  2028. updateObj.updateBasePrcArr
  2029. );
  2030. }
  2031. }
  2032. }
  2033. } else if (beginRow <= maxRow && endRow > maxRow) {
  2034. updateCount = maxRow - beginRow + 1;
  2035. for (let i = 0; i < updateCount; i++) {
  2036. let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
  2037. if (updateObj && typeof updateObj.updateGlj !== "undefined") {
  2038. updateArr = updateArr.concat(updateObj.updateGlj);
  2039. if (typeof updateObj.updateBasePrcArr !== "undefined") {
  2040. updateBasePrcArr = updateBasePrcArr.concat(
  2041. updateObj.updateBasePrcArr
  2042. );
  2043. }
  2044. }
  2045. }
  2046. //if(info.cellRange.colCount >= me.setting.header.length - 4 && info.cellRange.colCount <= me.setting.header.length){
  2047. //[code, ..., gljType]
  2048. if (
  2049. info.cellRange.colCount >= 5 &&
  2050. info.cellRange.colCount <= me.setting.header.length
  2051. ) {
  2052. for (let i = updateCount; i < items.length; i++) {
  2053. if (me.isValidObj(items[i])) {
  2054. items[i].component = [];
  2055. addArr.push(items[i]);
  2056. }
  2057. }
  2058. }
  2059. } else {
  2060. //if(info.cellRange.colCount >= me.setting.header.length - 4 && info.cellRange.colCount <= me.setting.header.length && info.cellRange.col + info.cellRange.colCount - 1 >= 5){
  2061. //粘贴的的最大列至少要等于工料机类型列,因为工料机类型必须有效才可新增
  2062. if (
  2063. info.cellRange.colCount >= 5 &&
  2064. info.cellRange.colCount <= me.setting.header.length &&
  2065. info.cellRange.col + info.cellRange.colCount - 1 >=
  2066. me.colMapping.fieldToCol["gljType"]
  2067. ) {
  2068. for (let i = 0; i < items.length; i++) {
  2069. if (me.isValidObj(items[i])) {
  2070. items[i].component = [];
  2071. addArr.push(items[i]);
  2072. }
  2073. }
  2074. }
  2075. }
  2076. //repaint
  2077. for (let i = 0; i < info.cellRange.rowCount; i++) {
  2078. resumeArr.push(info.cellRange.row + i);
  2079. }
  2080. if (resumeArr.length > 0) {
  2081. info.sheet.suspendPaint();
  2082. for (let i = 0; i < resumeArr.length; i++) {
  2083. if (resumeArr[i] < me.currentCache.length) {
  2084. for (let col = 0; col < me.setting.header.length; col++) {
  2085. let dCode = me.setting.header[col].dataCode;
  2086. if (me.priceCols.includes(col)) {
  2087. let price = me.getPrice(me.currentCache[resumeArr[i]], col);
  2088. info.sheet.setValue(resumeArr[i], col, price ? price : 0);
  2089. } else if (dCode === "gljType") {
  2090. let gljType = me.currentCache[resumeArr[i]][dCode];
  2091. info.sheet.setValue(
  2092. resumeArr[i],
  2093. col,
  2094. me.distTypeTree.distTypes["gljType" + gljType].data.fullName
  2095. );
  2096. } else if (dCode === "materialType") {
  2097. info.sheet.setValue(
  2098. resumeArr[i],
  2099. col,
  2100. me.currentCache[resumeArr[i]][dCode]
  2101. ? me.materialTypeIdx[me.currentCache[resumeArr[i]][dCode]]
  2102. : ""
  2103. );
  2104. } else if (dCode === "model") {
  2105. info.sheet.setValue(
  2106. resumeArr[i],
  2107. col,
  2108. me.currentCache[resumeArr[i]][dCode]
  2109. ? me.machineModelIdx[me.currentCache[resumeArr[i]][dCode]]
  2110. : ""
  2111. );
  2112. } else {
  2113. info.sheet.setValue(
  2114. resumeArr[i],
  2115. col,
  2116. me.currentCache[resumeArr[i]][dCode]
  2117. );
  2118. }
  2119. }
  2120. } else {
  2121. for (let col = 0; col < me.setting.header.length; col++) {
  2122. info.sheet.setValue(resumeArr[i], col, "");
  2123. }
  2124. }
  2125. }
  2126. info.sheet.resumePaint();
  2127. }
  2128. if (updateArr.length > 0 || addArr.length > 0) {
  2129. me.mixUpdateRequest(updateArr, addArr, []);
  2130. } else {
  2131. $.bootstrapLoading.end();
  2132. }
  2133. if (updateBasePrcArr.length > 0 && me.rationLibs.length > 0) {
  2134. me.updateRationBasePrcRq(updateBasePrcArr);
  2135. }
  2136. },
  2137. updateRationBasePrcRq: function (basePrcArr, workBook, callback) {
  2138. let me = this;
  2139. me.prevent = true;
  2140. me.calcRation = true;
  2141. if (!$.bootstrapLoading.isLoading()) {
  2142. $.bootstrapLoading.start();
  2143. }
  2144. $.ajax({
  2145. type: "post",
  2146. url: "api/updateRationBasePrc",
  2147. data: {
  2148. basePrcArr: JSON.stringify(basePrcArr),
  2149. repId: pageOprObj.gljLibId,
  2150. },
  2151. dataType: "json",
  2152. success: function (result) {
  2153. me.calcRation = false;
  2154. if (result.error) {
  2155. alert("计算定额基价失败");
  2156. }
  2157. if (workBook) {
  2158. workBook.focus(true);
  2159. } else {
  2160. me.workBook.focus(true);
  2161. }
  2162. me.prevent = false;
  2163. if (callback) {
  2164. callback();
  2165. }
  2166. if ($.bootstrapLoading.isLoading()) {
  2167. $.bootstrapLoading.end();
  2168. }
  2169. },
  2170. });
  2171. },
  2172. mixUpdateRequest: function (updateArr, addArr, removeIds) {
  2173. let me = repositoryGljObj;
  2174. if (updateArr.length > 0) {
  2175. me.saveInString(updateArr);
  2176. }
  2177. if (addArr.length > 0) {
  2178. const codeMap = {};
  2179. const uniqueCodeAddArr = [];
  2180. addArr.forEach((item) => {
  2181. if (!codeMap[item.code]) {
  2182. codeMap[item.code] = 1;
  2183. uniqueCodeAddArr.push(item);
  2184. }
  2185. });
  2186. addArr = uniqueCodeAddArr;
  2187. me.saveInString(addArr);
  2188. }
  2189. $.ajax({
  2190. type: "POST",
  2191. url: "api/mixUpdateGljItems",
  2192. data: {
  2193. repositoryId: me.currentRepositoryId,
  2194. lastOpr: userAccount,
  2195. updateItems: JSON.stringify(updateArr),
  2196. addItems: JSON.stringify(addArr),
  2197. removeIds: JSON.stringify(removeIds),
  2198. },
  2199. dataType: "json",
  2200. cache: false,
  2201. timeout: 50000,
  2202. success: function (result) {
  2203. if (result.error) {
  2204. alert(result.message);
  2205. } else {
  2206. const failCodes = result.data.failCode;
  2207. if (failCodes && failCodes.length) {
  2208. let failText = "";
  2209. failCodes.forEach((code) => {
  2210. failText += `<p>编码“${code}”已存在</p>`;
  2211. });
  2212. $("#alertText").html(failText);
  2213. $("#codeAlert").modal("show");
  2214. }
  2215. const insertData = result.data.insertData;
  2216. me.updateCache(insertData, updateArr, removeIds);
  2217. //me.sortGlj();
  2218. if (me.currentOprParent === 1) {
  2219. me.currentCache = me.getParentCache(
  2220. me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]
  2221. );
  2222. } else {
  2223. me.currentCache = me.getCache();
  2224. }
  2225. me.showGljItems(me.currentCache, me.gljCurTypeId);
  2226. //getCurrentGlj
  2227. let row = me.workBook.getSheet(0).getSelections()[0].row;
  2228. me.currentGlj =
  2229. row < me.currentCache.length ? me.currentCache[row] : null;
  2230. me.currentComponent = me.currentGlj
  2231. ? me.getCurrentComponent(me.currentGlj.component)
  2232. : [];
  2233. sheetCommonObj.cleanData(
  2234. gljComponentOprObj.workBook.getSheet(0),
  2235. gljComponentOprObj.setting,
  2236. -1
  2237. );
  2238. sheetsOprObj.showData(
  2239. gljComponentOprObj,
  2240. gljComponentOprObj.workBook.getSheet(0),
  2241. gljComponentOprObj.setting,
  2242. me.currentComponent
  2243. );
  2244. }
  2245. if (!me.calcRation && $.bootstrapLoading.isLoading()) {
  2246. $.bootstrapLoading.end();
  2247. }
  2248. },
  2249. error: function (err) {
  2250. if ($.bootstrapLoading.isLoading()) {
  2251. $.bootstrapLoading.end();
  2252. }
  2253. console.log(err);
  2254. alert("保存失败");
  2255. },
  2256. });
  2257. },
  2258. saveInString: function (datas) {
  2259. for (let i = 0, len = datas.length; i < len; i++) {
  2260. let data = datas[i];
  2261. if (_exist(data, "basePrice")) {
  2262. data["basePrice"] = data["basePrice"].toString();
  2263. }
  2264. if (_exist(data, "component")) {
  2265. for (let j = 0, jLen = data["component"].length; j < jLen; j++) {
  2266. let comGljObj = data["component"][j];
  2267. if (_exist(comGljObj, "consumeAmt")) {
  2268. comGljObj["consumeAmt"] = comGljObj["consumeAmt"].toString();
  2269. }
  2270. }
  2271. }
  2272. }
  2273. function _exist(data, attr) {
  2274. return data && data[attr] !== undefined && data[attr];
  2275. }
  2276. },
  2277. getParentCache: function (nodes) {
  2278. let me = repositoryGljObj,
  2279. rst = [];
  2280. for (let i = 0; i < me.gljList.length; i++) {
  2281. if (nodes.indexOf(me.gljList[i].gljClass) !== -1) {
  2282. rst.push(me.gljList[i]);
  2283. }
  2284. }
  2285. rst.sort(function (a, b) {
  2286. let rst = 0;
  2287. if (a.code > b.code) rst = 1;
  2288. else if (a.code < b.code) rst = -1;
  2289. return rst;
  2290. });
  2291. return rst;
  2292. },
  2293. getCache: function () {
  2294. let me = this,
  2295. rst = [];
  2296. for (let i = 0; i < me.gljList.length; i++) {
  2297. if (me.gljList[i].gljClass == me.gljCurTypeId) {
  2298. rst.push(me.gljList[i]);
  2299. }
  2300. }
  2301. return rst;
  2302. },
  2303. updateCache: function (insertData, updateArr, removeIds) {
  2304. let me = this,
  2305. cacheSection = me.gljList;
  2306. if (insertData && insertData.length > 0) {
  2307. me.gljList = me.gljList.concat(insertData);
  2308. cacheSection = me.gljList;
  2309. }
  2310. for (let i = removeIds.length - 1; i >= 0; i--) {
  2311. for (let j = cacheSection.length - 1; j >= 0; j--) {
  2312. if (cacheSection[j]["ID"] == removeIds[i]) {
  2313. cacheSection.splice(j, 1);
  2314. }
  2315. }
  2316. }
  2317. /*if (result && result.data && result.data.ops && result.data.ops.length > 0) {
  2318. for (let i = 0; i < result.data.ops.length; i++) {
  2319. for (let j = 0; j < cacheSection.length; j++) {
  2320. if (cacheSection[j]['code'] == result.data.ops[i]['code']) {
  2321. cacheSection[j]["ID"] = result.data.ops[i]["ID"];
  2322. }
  2323. }
  2324. }
  2325. }*/
  2326. for (let i = 0; i < updateArr.length; i++) {
  2327. for (let j = 0; j < cacheSection.length; j++) {
  2328. if (updateArr[i]["ID"] && cacheSection[j]["ID"]) {
  2329. if (cacheSection[j]["ID"] == updateArr[i]["ID"]) {
  2330. cacheSection[j] = updateArr[i];
  2331. }
  2332. } else {
  2333. if (cacheSection[j]["code"] == updateArr[i]["code"]) {
  2334. cacheSection[j] = updateArr[i];
  2335. }
  2336. }
  2337. }
  2338. }
  2339. },
  2340. updateParentNodeIds: function (nodes, caller) {
  2341. let private_build_parentNodeIds = function (pNodeId, nodesArr) {
  2342. let rst = [];
  2343. for (let i = 0; i < nodesArr.length; i++) {
  2344. if (nodesArr[i].children.length > 0) {
  2345. rst = rst.concat(
  2346. private_build_parentNodeIds(
  2347. nodesArr[i].data.ID,
  2348. nodesArr[i].children
  2349. )
  2350. );
  2351. } else {
  2352. rst.push(nodesArr[i].data.ID);
  2353. }
  2354. }
  2355. if (pNodeId && rst.length > 0) {
  2356. caller.parentNodeIds["_pNodeId_" + pNodeId] = rst;
  2357. }
  2358. return rst;
  2359. };
  2360. if (caller.parentNodeIds) {
  2361. private_build_parentNodeIds(null, nodes);
  2362. }
  2363. },
  2364. sortGljDeep: function (datas) {
  2365. function recurCompare(a, b, index) {
  2366. if (a[index] && !b[index]) {
  2367. return 1;
  2368. } else if (!a[index] && b[index]) {
  2369. return -1;
  2370. } else if (a[index] && b[index]) {
  2371. let aV = a[index],
  2372. bV = b[index];
  2373. if (!isNaN(aV) && !isNaN(bV)) {
  2374. aV = parseFloat(a[index]);
  2375. bV = parseFloat(b[index]);
  2376. }
  2377. if (aV > bV) {
  2378. return 1;
  2379. } else if (aV < bV) {
  2380. return -1;
  2381. } else {
  2382. return recurCompare(a, b, index + 1);
  2383. }
  2384. }
  2385. return 0;
  2386. }
  2387. //排序符号-
  2388. datas.sort(function (a, b) {
  2389. let aArr = a.code.split("-"),
  2390. bArr = b.code.split("-");
  2391. return recurCompare(aArr, bArr, 0);
  2392. });
  2393. },
  2394. //工料机排序
  2395. sortGlj: function () {
  2396. let me = this;
  2397. me.gljList.sort(function (a, b) {
  2398. let rst = 0;
  2399. if (a.code > b.code) rst = 1;
  2400. else if (a.code < b.code) rst = -1;
  2401. return rst;
  2402. });
  2403. },
  2404. };
  2405. let gljTypeTreeOprObj = {
  2406. onClick: function (event, treeId, treeNode) {
  2407. let me = repositoryGljObj,
  2408. that = gljComponentOprObj,
  2409. gljTypeId = treeNode.ID;
  2410. me.gljCurTypeId = treeNode.ID;
  2411. me.addGljObj = null;
  2412. sheetCommonObj.cleanSheet(that.workBook.getSheet(0), that.setting, 10);
  2413. if (me.parentNodeIds["_pNodeId_" + treeNode.ID]) {
  2414. me.currentOprParent = 1;
  2415. me.currentCache = me.getParentCache(
  2416. me.parentNodeIds["_pNodeId_" + treeNode.ID]
  2417. );
  2418. me.workBook.getSheet(0).setRowCount(me.currentCache.length);
  2419. } else {
  2420. me.currentOprParent = 0;
  2421. me.currentCache = me.getCache();
  2422. }
  2423. me.showGljItems(me.currentCache, gljTypeId);
  2424. },
  2425. beforeRename: function (treeId, treeNode, newName, isCancel) {
  2426. if (newName.length == 0) {
  2427. return false;
  2428. }
  2429. return true;
  2430. },
  2431. onRename: function (e, treeId, treeNode, isCancel) {
  2432. let nodes = [];
  2433. nodes.push(treeNode);
  2434. gljTypeTreeOprObj.updateNodes(nodes);
  2435. },
  2436. onBeforeRemove: function (treeId, treeNode) {
  2437. let me = this;
  2438. if (treeNode.ParentID == -1 && treeNode.isFirstNode) {
  2439. alert("不允许删除全部!");
  2440. return false;
  2441. }
  2442. if (!confirm("您确定要删除此节点及所有子节点的数据?删除后不可恢复!")) {
  2443. return false;
  2444. }
  2445. let nodeIds = [],
  2446. preNode = treeNode.getPreNode(),
  2447. preNodeId = -1;
  2448. if (preNode) {
  2449. preNodeId = preNode.ID;
  2450. }
  2451. private_fetchAllSubItems = function (pItem) {
  2452. nodeIds.push(pItem.ID);
  2453. if (pItem.items && pItem.items.length > 0) {
  2454. for (let i = 0; i < pItem.items.length; i++) {
  2455. private_fetchAllSubItems(pItem.items[i]);
  2456. }
  2457. }
  2458. };
  2459. nodeIds.push(treeNode.ID);
  2460. for (let i = 0; i < treeNode.items.length; i++) {
  2461. private_fetchAllSubItems(treeNode.items[i]);
  2462. }
  2463. $.ajax({
  2464. type: "POST",
  2465. url: "api/deleteGljNodes",
  2466. data: {
  2467. repId: pageOprObj.gljLibId,
  2468. lastOpr: userAccount,
  2469. nodes: JSON.stringify(nodeIds),
  2470. preNodeId: preNodeId,
  2471. preNodeNextId: treeNode.NextSiblingID,
  2472. },
  2473. dataType: "json",
  2474. cache: false,
  2475. timeout: 5000,
  2476. success: function (result, textStatus, status) {
  2477. let pNode = treeNode.getParentNode();
  2478. if (pNode && pNode.items && pNode.items.length == 1) {
  2479. pNode.isParent = false;
  2480. }
  2481. },
  2482. error: function () {},
  2483. });
  2484. return true;
  2485. },
  2486. onRemove: function (e, treeId, treeNode) {
  2487. let me = repositoryGljObj,
  2488. pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
  2489. if (pNode && pNode.items && pNode.items.length == 0) {
  2490. pNode.isParent = false;
  2491. me.treeObj.refresh();
  2492. }
  2493. },
  2494. updateNodes: function (nodes) {
  2495. if (nodes && nodes.length > 0) {
  2496. let reqData = [];
  2497. for (let i = 0; i < nodes.length; i++) {
  2498. let node = {};
  2499. node.repositoryId = nodes[i].repositoryId;
  2500. node.ID = nodes[i].ID;
  2501. node.ParentID = nodes[i].ParentID;
  2502. node.NextSiblingID = nodes[i].NextSiblingID;
  2503. node.Name = nodes[i].Name;
  2504. reqData.push(node);
  2505. }
  2506. $.ajax({
  2507. type: "POST",
  2508. url: "api/updateGljNodes",
  2509. data: {
  2510. repId: pageOprObj.gljLibId,
  2511. lastOpr: userAccount,
  2512. nodes: JSON.stringify(reqData),
  2513. },
  2514. dataType: "json",
  2515. cache: false,
  2516. timeout: 5000,
  2517. success: function (result, textStatus, status) {
  2518. console.log(status + " : " + result);
  2519. },
  2520. error: function () {},
  2521. });
  2522. }
  2523. },
  2524. addRootNode: function () {
  2525. let me = repositoryGljObj,
  2526. rawNode = { ParentID: -1, NextSiblingID: -1, Name: "所有" },
  2527. lastNodeId = -1;
  2528. if (me.treeObj) {
  2529. let rootNodes = me.treeObj.getNodes();
  2530. if (rootNodes.length == 0) {
  2531. gljTypeTreeOprObj.addNewNode(rawNode, lastNodeId, function (err, rst) {
  2532. if (!err) {
  2533. let newNodes = [],
  2534. isSilent = false;
  2535. newNodes.push({
  2536. repositoryId: rst.data.repositoryId,
  2537. ID: rst.data.ID,
  2538. ParentID: rst.data.ParentID,
  2539. NextSiblingID: -1,
  2540. Name: "所有",
  2541. isParent: false,
  2542. items: [],
  2543. });
  2544. me.treeObj.addNodes(null, -1, newNodes, isSilent);
  2545. }
  2546. });
  2547. }
  2548. }
  2549. },
  2550. addNewNode: function (rawNode, lastNodeId, callback) {
  2551. $.ajax({
  2552. type: "POST",
  2553. url: "api/createNewGljTypeNode",
  2554. data: {
  2555. lastOpr: userAccount,
  2556. repositoryId: repositoryGljObj.currentRepositoryId,
  2557. lastNodeId: lastNodeId,
  2558. rawNodeData: JSON.stringify(rawNode),
  2559. },
  2560. dataType: "json",
  2561. cache: false,
  2562. timeout: 1000,
  2563. success: function (result, textStatus, status) {
  2564. callback(false, result);
  2565. },
  2566. error: function (err) {
  2567. callback(err);
  2568. },
  2569. });
  2570. },
  2571. addHoverDom: function (treeId, treeNode) {
  2572. if (typeof treeNode.doing !== "undefined" && treeNode.doing) {
  2573. return false;
  2574. }
  2575. hoverOpr();
  2576. function hoverOpr() {
  2577. let me = repositoryGljObj,
  2578. sObj = $("#" + treeNode.tId + "_span");
  2579. if (treeNode.editNameFlag || $("#addBtn_" + treeNode.tId).length > 0)
  2580. return;
  2581. let addStr =
  2582. "<span class='button add' id='addBtn_" +
  2583. treeNode.tId +
  2584. "' title='新增子节点' onfocus='this.blur();'></span>";
  2585. sObj.after(addStr);
  2586. let btn = $("#addBtn_" + treeNode.tId);
  2587. if (btn)
  2588. btn.bind("click", function () {
  2589. treeNode.doing = true;
  2590. let rawNode = {
  2591. ParentID: treeNode.ID,
  2592. NextSiblingID: -1,
  2593. Name: "新增子节点",
  2594. },
  2595. lastNodeId = -1;
  2596. if (treeNode.items.length > 0) {
  2597. lastNodeId = treeNode.items[treeNode.items.length - 1].ID;
  2598. }
  2599. gljTypeTreeOprObj.addNewNode(
  2600. rawNode,
  2601. lastNodeId,
  2602. function (err, rst) {
  2603. if (!err) {
  2604. let newNodes = [],
  2605. isSilent = false;
  2606. if (treeNode.items.length > 0) {
  2607. treeNode.items[treeNode.items.length - 1].NextSiblingID =
  2608. rst.data.ID;
  2609. }
  2610. newNodes.push({
  2611. repositoryId: rst.data.repositoryId,
  2612. ID: rst.data.ID,
  2613. ParentID: rst.data.ParentID,
  2614. NextSiblingID: -1,
  2615. Name: "新增子节点",
  2616. isParent: false,
  2617. items: [],
  2618. });
  2619. treeNode.isParent = true;
  2620. if (me.treeObj) {
  2621. me.treeObj.addNodes(treeNode, -1, newNodes, isSilent);
  2622. } else {
  2623. me.treeObj = $.fn.zTree.init(
  2624. $("#rationChapterTree"),
  2625. gljSetting,
  2626. newNodes
  2627. );
  2628. }
  2629. treeNode.doing = false;
  2630. hoverOpr();
  2631. }
  2632. }
  2633. );
  2634. });
  2635. }
  2636. },
  2637. removeHoverDom: function (treeId, treeNode) {
  2638. $("#addBtn_" + treeNode.tId)
  2639. .unbind()
  2640. .remove();
  2641. },
  2642. };
  2643. const setTimeoutSync = (handle, time) => {
  2644. return new Promise((resolve, reject) => {
  2645. setTimeout(() => {
  2646. try {
  2647. if (handle && typeof handle === "function") {
  2648. handle();
  2649. }
  2650. resolve();
  2651. } catch (err) {
  2652. reject(err);
  2653. }
  2654. }, time);
  2655. });
  2656. };
  2657. setTimeoutSync(() => {
  2658. //throw new Error('a');
  2659. })
  2660. .then((v) => {
  2661. setTimeoutSync(() => {
  2662. //Promise.reject(new Error('b'))
  2663. //throw new Error('b');
  2664. });
  2665. })
  2666. .catch((err) => console.log(err));
  2667. $(document).ready(function () {
  2668. let moduleName = "stdGLj";
  2669. function refreshALlWorkBook() {
  2670. if (gljClassTreeObj.workBook) {
  2671. gljClassTreeObj.workBook.refresh();
  2672. }
  2673. if (repositoryGljObj.workBook) {
  2674. repositoryGljObj.workBook.refresh();
  2675. }
  2676. if (gljComponentOprObj.workBook) {
  2677. gljComponentOprObj.workBook.refresh();
  2678. }
  2679. }
  2680. SlideResize.loadHorizonWidth(
  2681. moduleName,
  2682. [$("#slideResizeLeft"), $("#slideResizeRight")],
  2683. [$("#leftContent"), $("#midContent"), $("#rightContent")],
  2684. function () {
  2685. refreshALlWorkBook();
  2686. }
  2687. );
  2688. //章节树与人材机表
  2689. let leftElesObj = {};
  2690. leftElesObj.module = moduleName;
  2691. leftElesObj.resize = $("#slideResizeLeft");
  2692. leftElesObj.parent = $("#dataRow");
  2693. leftElesObj.left = $("#leftContent");
  2694. leftElesObj.right = $("#midContent");
  2695. SlideResize.horizontalSlide(
  2696. leftElesObj,
  2697. {
  2698. min: 200,
  2699. max: `$('#dataRow').width() - $('#rightContent').width() - 200`,
  2700. },
  2701. function () {
  2702. refreshALlWorkBook();
  2703. }
  2704. );
  2705. //人材机表与人材机组成物表
  2706. let rightElesObj = {};
  2707. rightElesObj.module = moduleName;
  2708. rightElesObj.resize = $("#slideResizeRight");
  2709. rightElesObj.parent = $("#dataRow");
  2710. rightElesObj.left = $("#midContent");
  2711. rightElesObj.right = $("#rightContent");
  2712. SlideResize.horizontalSlide(
  2713. rightElesObj,
  2714. {
  2715. min: 200,
  2716. max: `$('#dataRow').width() - $('#leftContent').width() - 200`,
  2717. },
  2718. function () {
  2719. let resizeRate =
  2720. (SlideResize.resizeWidth * 100) / $("#midContent").width(),
  2721. sheetRate = 100 - resizeRate;
  2722. $("#slideResizeLeft").css("width", `${resizeRate}%`);
  2723. $("#GLJListSheet").css("width", `${sheetRate}%`);
  2724. refreshALlWorkBook();
  2725. }
  2726. );
  2727. $("#moveToConfirm").click(function () {
  2728. let sheet = repositoryGljObj.workBook.getSheet(0);
  2729. let sel = sheet.getSelections()[0];
  2730. let gljs = repositoryGljObj.currentCache.slice(
  2731. sel.row,
  2732. sel.row + sel.rowCount
  2733. );
  2734. let node = gljClassTreeObj.zTreeSetting.selected;
  2735. let updateArr = [];
  2736. for (let glj of gljs) {
  2737. const data = _.cloneDeep(glj);
  2738. data.gljClass = node.ID;
  2739. updateArr.push(data);
  2740. }
  2741. repositoryGljObj.mixUpdateRequest(updateArr, [], []);
  2742. $("#moveTo").modal("hide");
  2743. });
  2744. });