glj.js 89 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805
  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. editCode: async function () {
  1475. const sheet = this.workBook.getSheet(0);
  1476. const row = sheet.getActiveRowIndex();
  1477. const glj = this.currentCache[row];
  1478. if (!glj) {
  1479. alert('请选中工料机!');
  1480. $('#edit-code').modal('hide');
  1481. return;
  1482. }
  1483. const newCode = $('#edit-code-text').val();
  1484. if (!newCode) {
  1485. alert('编号不可为空!');
  1486. $('#edit-code-text').focus();
  1487. return;
  1488. }
  1489. if (this.gljList.some(item => item.ID !== glj.ID && item.code === newCode)) {
  1490. alert('编号已存在!');
  1491. $('#edit-code-text').focus();
  1492. return;
  1493. }
  1494. if (newCode === glj.code) {
  1495. $('#edit-code').modal('hide');
  1496. return;
  1497. }
  1498. this.mixUpdateRequest([{ ...glj, code: newCode }], [], []);
  1499. $('#edit-code').modal('hide');
  1500. },
  1501. onContextmenuOpr: function () {
  1502. let me = repositoryGljObj;
  1503. $.contextMenu({
  1504. selector: "#GLJListSheet",
  1505. build: function ($triggerElement, e) {
  1506. //控制允许右键菜单在哪个位置出现
  1507. let sheet = me.workBook.getSheet(0);
  1508. let offset = $("#GLJListSheet").offset(),
  1509. x = e.pageX - offset.left,
  1510. y = e.pageY - offset.top;
  1511. let target = sheet.hitTest(x, y);
  1512. let sel = sheet.getSelections()[0];
  1513. if (sel.row === -1) {
  1514. sel.row = 0;
  1515. }
  1516. if (sel.col === -1) {
  1517. sel.col = 0;
  1518. }
  1519. if (
  1520. target.hitTestType === 3 &&
  1521. typeof target.row !== "undefined" &&
  1522. typeof target.col !== "undefined"
  1523. ) {
  1524. //在表格内
  1525. me.initSel(target.row);
  1526. if (
  1527. sel.row > target.row ||
  1528. sel.row + sel.rowCount - 1 < target.row ||
  1529. sel.col > target.col ||
  1530. sel.col + sel.colCount - 1 < target.col
  1531. ) {
  1532. sheet.setActiveCell(target.row, target.col);
  1533. }
  1534. return {
  1535. callback: function () { },
  1536. items: {
  1537. edit: {
  1538. name: "修改编号",
  1539. disabled: function () {
  1540. return (
  1541. locked || !(me.currentCache && me.currentCache[target.row])
  1542. );
  1543. },
  1544. icon: "fa-edit",
  1545. callback: function (key, opt) {
  1546. if (me.currentCache[target.row]) {
  1547. $('#edit-code').modal('show');
  1548. $('#edit-code-text').val(me.currentCache[target.row].code || '');
  1549. }
  1550. },
  1551. },
  1552. delete: {
  1553. name: "删除",
  1554. disabled: function () {
  1555. return (
  1556. locked || !(me.currentCache && me.currentCache[target.row])
  1557. );
  1558. },
  1559. icon: "fa-remove",
  1560. callback: function (key, opt) {
  1561. let curSel = _.cloneDeep(sheet.getSelections()[0]);
  1562. curSel.colCount = me.setting.header.length;
  1563. me.delGljs([curSel]);
  1564. },
  1565. },
  1566. getReference: {
  1567. name: "查找引用",
  1568. disabled: function () {
  1569. return !(me.currentCache && me.currentCache[target.row]);
  1570. },
  1571. icon: "fa-search",
  1572. callback: function () {
  1573. const glj = me.currentCache[target.row];
  1574. me.getReference(glj);
  1575. },
  1576. },
  1577. moveTo: {
  1578. name: "移动分类至…",
  1579. disabled: function () {
  1580. return (
  1581. locked || !(me.currentCache && me.currentCache[target.row])
  1582. );
  1583. },
  1584. icon: "fa-exchange",
  1585. callback: function (key, opt) {
  1586. me.moveTo([]);
  1587. },
  1588. },
  1589. },
  1590. };
  1591. } else {
  1592. return false;
  1593. }
  1594. },
  1595. });
  1596. },
  1597. getReference: function (glj) {
  1598. const $info = $("#info");
  1599. const $infoBody = $("#infoBody");
  1600. $.bootstrapLoading.start();
  1601. CommonAjax.post(
  1602. "/stdGljRepository/api/getReference",
  1603. { repositoryId: glj.repositoryId, gljId: glj.ID },
  1604. function (info) {
  1605. const htmlArr = [];
  1606. if (!info || !Object.keys(info).length) {
  1607. htmlArr.push("<li>无引用数据</li>");
  1608. }
  1609. for (let libName in info) {
  1610. htmlArr.push(`<li class="list-title">${libName}</li>`);
  1611. const rations = info[libName];
  1612. const rationList = rations.map((ration) => {
  1613. if (ration.rationRepId) {
  1614. return `<li>
  1615. <span>${ration.code}</span>
  1616. <a target="_blank" href="/rationRepository/ration?repository=${ration.rationRepId}&locked=${locked}#${ration.code}">定位</a>
  1617. </li>`;
  1618. }
  1619. return `<li><span>${ration.code}</span></li>`;
  1620. });
  1621. htmlArr.push(...rationList);
  1622. }
  1623. $infoBody.html(htmlArr.join(""));
  1624. $info.modal("show");
  1625. $.bootstrapLoading.end();
  1626. },
  1627. function () {
  1628. $.bootstrapLoading.end();
  1629. }
  1630. );
  1631. },
  1632. moveTo: function () {
  1633. $("#moveToConfirm").prop("disabled", true);
  1634. $("#moveTo").modal("show");
  1635. },
  1636. validUpdateObj: function (pasteObj, rowIdx) {
  1637. let rst = { updateGlj: [], updateBasePrcArr: [] },
  1638. backUpObj = {},
  1639. me = repositoryGljObj,
  1640. that = gljComponentOprObj,
  1641. tempObj = me.currentCache[rowIdx],
  1642. reCalBasePrc = false,
  1643. isValid = true,
  1644. materialTypeValid = true;
  1645. //备份原始数据
  1646. for (let atr in tempObj) {
  1647. backUpObj[atr] = tempObj[atr];
  1648. }
  1649. if (typeof pasteObj.code !== "undefined") {
  1650. if (pasteObj.code.trim().length !== 0) {
  1651. let isExist = false;
  1652. for (let i = 0; i < me.gljList.length; i++) {
  1653. if (me.gljList[i].code === pasteObj.code) {
  1654. isExist = true;
  1655. break;
  1656. }
  1657. }
  1658. if (!isExist) {
  1659. tempObj.code = pasteObj.code;
  1660. } else isValid = false;
  1661. } else isValid = false;
  1662. }
  1663. if (typeof pasteObj.name !== "undefined") {
  1664. if (pasteObj.name.trim().length === 0) isValid = false;
  1665. else tempObj.name = pasteObj.name;
  1666. }
  1667. if (typeof pasteObj.specs !== "undefined") {
  1668. tempObj.specs = pasteObj.specs;
  1669. }
  1670. if (typeof pasteObj.unit !== "undefined") {
  1671. tempObj.unit = pasteObj.unit;
  1672. }
  1673. if (typeof pasteObj.gljType !== "undefined") {
  1674. let isExsit = false;
  1675. for (let i = 0; i < me.distTypeTree.comboDatas.length; i++) {
  1676. if (pasteObj.gljType === me.distTypeTree.comboDatas[i].text) {
  1677. pasteObj.gljType = me.distTypeTree.comboDatas[i].value;
  1678. isExsit = true;
  1679. if (
  1680. !me.taxRateTypes.includes(pasteObj.taxRate) &&
  1681. me.taxRateTypes.includes(tempObj.taxRate)
  1682. ) {
  1683. tempObj.taxRate = null;
  1684. }
  1685. //调整系数
  1686. if (pasteObj.gljType !== 1 && pasteObj.gljType !== 303) {
  1687. tempObj.adjCoe = null;
  1688. } else if (
  1689. (pasteObj.gljType === 1 || pasteObj.gljType === 303) &&
  1690. typeof pasteObj.adjCoe !== "undefined" &&
  1691. !isNaN(pasteObj.adjCoe) &&
  1692. pasteObj.adjCoe % 1 === 0
  1693. ) {
  1694. tempObj.adjCoe = pasteObj.adjCoe;
  1695. }
  1696. if (pasteObj.gljType !== 301 && tempObj.gljType === 301) {
  1697. tempObj.model = null;
  1698. }
  1699. if (
  1700. componentType.includes(tempObj.gljType) &&
  1701. //!(tempObj.gljType === 302 && pasteObj.gljType === 303) && !(tempObj.gljType === 303 && pasteObj.gljType === 302)){//修改了原本是组成物的工料机
  1702. !(
  1703. machineComponent.includes(tempObj.gljType) &&
  1704. machineComponent.includes(pasteObj.gljType)
  1705. ) &&
  1706. !(
  1707. materialComponent.includes(tempObj.gljType) &&
  1708. materialComponent.includes(pasteObj.gljType)
  1709. )
  1710. ) {
  1711. //修改了原本是组成物的工料机
  1712. //寻找所有引用了此组成物的工料机,并从组成物中删去此工料机,并重算单价
  1713. let updateGljs = me.getUpdateGljs(tempObj, true);
  1714. if (
  1715. updateGljs.updateArr.length > 0 ||
  1716. updateGljs.updateBasePrcArr.length > 0
  1717. ) {
  1718. for (let i = 0; i < updateGljs.updateArr.length; i++) {
  1719. rst.updateGlj.push(updateGljs.updateArr[i]);
  1720. }
  1721. for (let i = 0; i < updateGljs.updateBasePrcArr.length; i++) {
  1722. rst.updateBasePrcArr.push(updateGljs.updateBasePrcArr[i]);
  1723. }
  1724. }
  1725. }
  1726. tempObj.component =
  1727. tempObj.gljType === pasteObj.gljType ? tempObj.component : [];
  1728. /*if(me.allowComponent.indexOf(tempObj.gljType) !== -1){//更改成可含组成物的工料机类型,定额价设置为零
  1729. tempObj.basePrice = tempObj.gljType === me.distTypeTree.comboDatas[i].value ? tempObj.basePrice : 0;
  1730. }*/
  1731. tempObj.gljType = pasteObj.gljType;
  1732. tempObj.shortName =
  1733. me.distTypeTree.distTypes[
  1734. me.distTypeTree.prefix + tempObj.gljType
  1735. ].data.shortName;
  1736. break;
  1737. }
  1738. }
  1739. if (!isExsit) {
  1740. isValid = false;
  1741. }
  1742. }
  1743. if (
  1744. typeof pasteObj.taxRate !== "undefined" &&
  1745. typeof pasteObj.gljType === "undefined"
  1746. ) {
  1747. if (me.taxRateTypes.includes(tempObj.gljType)) {
  1748. tempObj.taxRate =
  1749. pasteObj.taxRate && !isNaN(pasteObj.taxRate)
  1750. ? scMathUtil.roundTo(parseFloat(pasteObj.taxRate), -2)
  1751. : null;
  1752. } else {
  1753. isValid = false;
  1754. }
  1755. }
  1756. if (
  1757. typeof pasteObj.adjCoe !== "undefined" &&
  1758. typeof pasteObj.gljType === "undefined"
  1759. ) {
  1760. if (
  1761. tempObj.gljType &&
  1762. (tempObj.gljType === 1 || tempObj.gljType === 303) &&
  1763. typeof pasteObj.adjCoe !== "undefined" &&
  1764. !isNaN(pasteObj.adjCoe) &&
  1765. pasteObj.adjCoe % 1 === 0
  1766. ) {
  1767. tempObj.adjCoe = pasteObj.adjCoe;
  1768. } else {
  1769. isValid = false;
  1770. }
  1771. }
  1772. //单价相关
  1773. if (me.pasteIncludesPrice(pasteObj)) {
  1774. if (!priceProperties || priceProperties.length === 0) {
  1775. pasteObj.basePrice =
  1776. pasteObj.basePrice && !isNaN(parseFloat(pasteObj.basePrice))
  1777. ? scMathUtil.roundTo(parseFloat(pasteObj.basePrice), -2)
  1778. : me.currentCache[rowIdx].basePrice;
  1779. if (pasteObj.basePrice !== me.currentCache[rowIdx].basePrice) {
  1780. reCalBasePrc = true;
  1781. tempObj.basePrice = pasteObj.basePrice;
  1782. }
  1783. } else {
  1784. //多单价粘贴
  1785. let pastePriceProperty = {};
  1786. let priceFields = me.getPriceFields();
  1787. for (let priceField of priceFields) {
  1788. if (
  1789. typeof pasteObj[priceField] !== "undefined" &&
  1790. pasteObj[priceField] &&
  1791. !isNaN(parseFloat(pasteObj[priceField]))
  1792. ) {
  1793. pastePriceProperty[priceField] = scMathUtil.roundTo(
  1794. parseFloat(pasteObj[priceField]),
  1795. -2
  1796. );
  1797. }
  1798. }
  1799. if (!me.priceIsEqual(tempObj, pasteObj)) {
  1800. reCalBasePrc = true;
  1801. //更新人材机单价
  1802. for (let priceField in pastePriceProperty) {
  1803. tempObj.priceProperty[priceField] = pastePriceProperty[priceField];
  1804. }
  1805. }
  1806. }
  1807. let updateGljs = me.getUpdateGljs(tempObj, false);
  1808. if (
  1809. updateGljs.updateArr.length > 0 ||
  1810. updateGljs.updateBasePrcArr.length > 0
  1811. ) {
  1812. for (let i = 0; i < updateGljs.updateArr.length; i++) {
  1813. rst.updateGlj.push(updateGljs.updateArr[i]);
  1814. }
  1815. for (let i = 0; i < updateGljs.updateBasePrcArr.length; i++) {
  1816. rst.updateBasePrcArr.push(updateGljs.updateBasePrcArr[i]);
  1817. }
  1818. }
  1819. }
  1820. if (typeof pasteObj.materialType !== "undefined") {
  1821. if (!me.materialType.textArr.includes(pasteObj.materialType)) {
  1822. isValid = false;
  1823. materialTypeValid = false;
  1824. } else {
  1825. me.materialType.comboItems.forEach(function (item) {
  1826. if (item.text === pasteObj.materialType) {
  1827. tempObj.materialType = item.value;
  1828. }
  1829. });
  1830. }
  1831. }
  1832. if (typeof pasteObj.materialCoe !== "undefined") {
  1833. if (
  1834. isNaN(pasteObj.materialCoe) ||
  1835. (!tempObj.materialType &&
  1836. (!pasteObj.materialType ||
  1837. !me.materialType.textArr.includes(pasteObj.materialType)))
  1838. ) {
  1839. tempObj.materialType = "";
  1840. tempObj.materialCoe = null;
  1841. isValid = false;
  1842. } else {
  1843. tempObj.materialCoe =
  1844. pasteObj.materialCoe !== ""
  1845. ? scMathUtil.roundTo(parseFloat(pasteObj.materialCoe), -5)
  1846. : null;
  1847. }
  1848. }
  1849. if (typeof pasteObj.model !== "undefined") {
  1850. if (!me.machineModel.textArr.includes(pasteObj.model)) {
  1851. isValid = false;
  1852. } else {
  1853. let existsModel = false;
  1854. if (
  1855. (typeof pasteObj.gljType !== "undefined" &&
  1856. pasteObj.gljType === 301) ||
  1857. (tempObj.gljType && tempObj.gljType === 301)
  1858. ) {
  1859. me.machineModel.comboItems.forEach(function (item) {
  1860. if (item.text === pasteObj.model) {
  1861. tempObj.model = item.value;
  1862. existsModel = true;
  1863. }
  1864. });
  1865. if (!existsModel) {
  1866. isValid = false;
  1867. }
  1868. } else {
  1869. isValid = false;
  1870. }
  1871. }
  1872. }
  1873. if (typeof pasteObj.materialIndexType !== "undefined") {
  1874. tempObj.materialIndexType = pasteObj.materialIndexType;
  1875. }
  1876. if (typeof pasteObj.materialIndexUnit !== "undefined") {
  1877. tempObj.materialIndexUnit = pasteObj.materialIndexUnit;
  1878. }
  1879. if (typeof pasteObj.materialIndexCoe !== "undefined") {
  1880. tempObj.materialIndexCoe = pasteObj.materialIndexCoe;
  1881. }
  1882. if (typeof pasteObj.lossRate !== "undefined" && !isNaN(pasteObj.lossRate)) {
  1883. tempObj.lossRate = pasteObj.lossRate;
  1884. }
  1885. if (isValid) {
  1886. rst.updateGlj.push(tempObj);
  1887. if (reCalBasePrc) {
  1888. //重新计算定额基价对象
  1889. let newReObj = {
  1890. gljId: tempObj.ID,
  1891. gljType: tempObj.gljType,
  1892. basePrice: me.getRationGljPrice(tempObj),
  1893. };
  1894. rst.updateBasePrcArr.push(newReObj);
  1895. }
  1896. } else {
  1897. for (let attr in backUpObj) {
  1898. tempObj[attr] = backUpObj[attr];
  1899. }
  1900. }
  1901. return rst;
  1902. },
  1903. //粘贴的数据是否是可添加的数据,只有含有编号,名称,类型才可添加
  1904. isValidObj: function (pasteObj) {
  1905. let me = repositoryGljObj;
  1906. if (
  1907. !(pasteObj.code && typeof pasteObj.code !== "undefined") ||
  1908. !(pasteObj.name && typeof pasteObj.name !== "undefined") ||
  1909. !(pasteObj.gljType && typeof pasteObj.gljType !== "undefined")
  1910. ) {
  1911. return false;
  1912. }
  1913. if (pasteObj.gljType && typeof pasteObj.gljType !== "undefined") {
  1914. let isExist = false;
  1915. for (let i = 0; i < me.distTypeTree.comboDatas.length; i++) {
  1916. if (me.distTypeTree.comboDatas[i].text === pasteObj.gljType) {
  1917. isExist = true;
  1918. pasteObj.gljType = me.distTypeTree.comboDatas[i].value;
  1919. pasteObj.shortName =
  1920. me.distTypeTree.distTypes[
  1921. me.distTypeTree.prefix + pasteObj.gljType
  1922. ].data.shortName;
  1923. break;
  1924. }
  1925. }
  1926. if (!isExist) {
  1927. return false;
  1928. }
  1929. }
  1930. if (pasteObj.code && typeof pasteObj.code !== "undefined") {
  1931. for (let i = 0; i < me.gljList.length; i++) {
  1932. if (me.gljList[i].code === pasteObj.code) {
  1933. return false;
  1934. }
  1935. }
  1936. }
  1937. if (
  1938. pasteObj.taxRate &&
  1939. (isNaN(pasteObj.taxRate) || !me.taxRateTypes.includes(pasteObj.gljType))
  1940. ) {
  1941. return false;
  1942. }
  1943. if (pasteObj.adjCoe && typeof pasteObj.adjCoe !== "undefined") {
  1944. if (isNaN(pasteObj.adjCoe) || pasteObj.adjCoe % 1 !== 0) {
  1945. return false;
  1946. }
  1947. }
  1948. if (pasteObj.materialType) {
  1949. if (!me.materialType.textArr.includes(pasteObj.materialType)) {
  1950. return false;
  1951. } else {
  1952. me.materialType.comboItems.forEach(function (item) {
  1953. if (item.text === pasteObj.materialType) {
  1954. pasteObj.materialType = item.value;
  1955. }
  1956. });
  1957. }
  1958. }
  1959. if (pasteObj.materialCoe) {
  1960. if (isNaN(pasteObj.materialCoe) || !pasteObj.materialType) {
  1961. return false;
  1962. }
  1963. }
  1964. if (typeof pasteObj.lossRate !== "undefined" && isNaN(pasteObj[feeCode])) {
  1965. return false;
  1966. }
  1967. if (typeof pasteObj.model !== "undefined" && pasteObj.model) {
  1968. if (
  1969. !me.machineModel.textArr.includes(pasteObj.model) ||
  1970. pasteObj.gljType !== 301
  1971. ) {
  1972. return false;
  1973. }
  1974. me.machineModel.comboItems.forEach(function (item) {
  1975. if (item.text === pasteObj.model) {
  1976. pasteObj.model = item.value;
  1977. }
  1978. });
  1979. }
  1980. if (!priceProperties || priceProperties.length === 0) {
  1981. pasteObj.basePrice =
  1982. !isNaN(parseFloat(pasteObj.basePrice)) &&
  1983. pasteObj.basePrice &&
  1984. typeof pasteObj.basePrice !== "undefined"
  1985. ? parseFloat(pasteObj.basePrice)
  1986. : 0;
  1987. } else {
  1988. let pastePriceProperty = {};
  1989. let priceFields = me.getPriceFields();
  1990. for (let priceField of priceFields) {
  1991. if (
  1992. typeof pasteObj[priceField] !== "undefined" &&
  1993. pasteObj[priceField] &&
  1994. !isNaN(parseFloat(pasteObj[priceField]))
  1995. ) {
  1996. pastePriceProperty[priceField] = scMathUtil.roundTo(
  1997. parseFloat(pasteObj[priceField]),
  1998. -2
  1999. );
  2000. } else {
  2001. pastePriceProperty[priceField] = 0;
  2002. }
  2003. }
  2004. pasteObj.priceProperty = pastePriceProperty;
  2005. }
  2006. //pasteObj.basePrice = !isNaN(parseFloat(pasteObj.basePrice)) && (pasteObj.basePrice && typeof pasteObj.basePrice !== 'undefined') ? parseFloat(pasteObj.basePrice) : 0;
  2007. if (!me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]) {
  2008. pasteObj.gljClass = me.gljCurTypeId;
  2009. pasteObj.classSeq = me.gljCurClassSeq;
  2010. }
  2011. return true;
  2012. },
  2013. canPasted: function (info) {
  2014. let rst = true;
  2015. let me = repositoryGljObj;
  2016. if (me.gljCurTypeId < 0) {
  2017. return false;
  2018. }
  2019. //粘贴的最大列下标不超过总列数
  2020. if (
  2021. info.cellRange.col + info.cellRange.colCount - 1 >
  2022. me.setting.header.length - 1
  2023. ) {
  2024. return false;
  2025. }
  2026. if (info.cellRange.row < me.currentCache.length) {
  2027. if (info.cellRange.col === 0) {
  2028. return false;
  2029. }
  2030. }
  2031. return rst;
  2032. },
  2033. onClipboardPasting: function (sender, args) {
  2034. let me = repositoryGljObj;
  2035. //复制的列数超过正确的列数,不可复制
  2036. if (me.prevent) {
  2037. args.cancel = true;
  2038. return;
  2039. }
  2040. if (!me.canPasted(args)) {
  2041. args.cancel = true;
  2042. }
  2043. },
  2044. onClipboardPasted: function (e, info) {
  2045. $.bootstrapLoading.start();
  2046. let me = repositoryGljObj;
  2047. let updateArr = [],
  2048. addArr = [];
  2049. let items = sheetCommonObj.analyzePasteData(me.setting, info);
  2050. let beginRow = info.cellRange.row,
  2051. endRow = info.cellRange.row + info.cellRange.rowCount - 1,
  2052. maxRow = me.currentCache.length - 1,
  2053. updateBasePrcArr = [],
  2054. updateCount,
  2055. resumeArr = [];
  2056. if (endRow <= maxRow) {
  2057. //updateItems = items;
  2058. for (let i = 0; i < items.length; i++) {
  2059. let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
  2060. if (
  2061. updateObj &&
  2062. typeof updateObj.updateGlj !== "undefined" &&
  2063. updateObj.updateGlj.length > 0
  2064. ) {
  2065. //updateArr = updateObj.updateGlj;
  2066. updateArr = updateArr.concat(updateObj.updateGlj);
  2067. if (typeof updateObj.updateBasePrcArr !== "undefined") {
  2068. //updateBasePrcArr = updateObj.updateBasePrc;
  2069. updateBasePrcArr = updateBasePrcArr.concat(
  2070. updateObj.updateBasePrcArr
  2071. );
  2072. }
  2073. }
  2074. }
  2075. } else if (beginRow <= maxRow && endRow > maxRow) {
  2076. updateCount = maxRow - beginRow + 1;
  2077. for (let i = 0; i < updateCount; i++) {
  2078. let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
  2079. if (updateObj && typeof updateObj.updateGlj !== "undefined") {
  2080. updateArr = updateArr.concat(updateObj.updateGlj);
  2081. if (typeof updateObj.updateBasePrcArr !== "undefined") {
  2082. updateBasePrcArr = updateBasePrcArr.concat(
  2083. updateObj.updateBasePrcArr
  2084. );
  2085. }
  2086. }
  2087. }
  2088. //if(info.cellRange.colCount >= me.setting.header.length - 4 && info.cellRange.colCount <= me.setting.header.length){
  2089. //[code, ..., gljType]
  2090. if (
  2091. info.cellRange.colCount >= 5 &&
  2092. info.cellRange.colCount <= me.setting.header.length
  2093. ) {
  2094. for (let i = updateCount; i < items.length; i++) {
  2095. if (me.isValidObj(items[i])) {
  2096. items[i].component = [];
  2097. addArr.push(items[i]);
  2098. }
  2099. }
  2100. }
  2101. } else {
  2102. //if(info.cellRange.colCount >= me.setting.header.length - 4 && info.cellRange.colCount <= me.setting.header.length && info.cellRange.col + info.cellRange.colCount - 1 >= 5){
  2103. //粘贴的的最大列至少要等于工料机类型列,因为工料机类型必须有效才可新增
  2104. if (
  2105. info.cellRange.colCount >= 5 &&
  2106. info.cellRange.colCount <= me.setting.header.length &&
  2107. info.cellRange.col + info.cellRange.colCount - 1 >=
  2108. me.colMapping.fieldToCol["gljType"]
  2109. ) {
  2110. for (let i = 0; i < items.length; i++) {
  2111. if (me.isValidObj(items[i])) {
  2112. items[i].component = [];
  2113. addArr.push(items[i]);
  2114. }
  2115. }
  2116. }
  2117. }
  2118. //repaint
  2119. for (let i = 0; i < info.cellRange.rowCount; i++) {
  2120. resumeArr.push(info.cellRange.row + i);
  2121. }
  2122. if (resumeArr.length > 0) {
  2123. info.sheet.suspendPaint();
  2124. for (let i = 0; i < resumeArr.length; i++) {
  2125. if (resumeArr[i] < me.currentCache.length) {
  2126. for (let col = 0; col < me.setting.header.length; col++) {
  2127. let dCode = me.setting.header[col].dataCode;
  2128. if (me.priceCols.includes(col)) {
  2129. let price = me.getPrice(me.currentCache[resumeArr[i]], col);
  2130. info.sheet.setValue(resumeArr[i], col, price ? price : 0);
  2131. } else if (dCode === "gljType") {
  2132. let gljType = me.currentCache[resumeArr[i]][dCode];
  2133. info.sheet.setValue(
  2134. resumeArr[i],
  2135. col,
  2136. me.distTypeTree.distTypes["gljType" + gljType].data.fullName
  2137. );
  2138. } else if (dCode === "materialType") {
  2139. info.sheet.setValue(
  2140. resumeArr[i],
  2141. col,
  2142. me.currentCache[resumeArr[i]][dCode]
  2143. ? me.materialTypeIdx[me.currentCache[resumeArr[i]][dCode]]
  2144. : ""
  2145. );
  2146. } else if (dCode === "model") {
  2147. info.sheet.setValue(
  2148. resumeArr[i],
  2149. col,
  2150. me.currentCache[resumeArr[i]][dCode]
  2151. ? me.machineModelIdx[me.currentCache[resumeArr[i]][dCode]]
  2152. : ""
  2153. );
  2154. } else {
  2155. info.sheet.setValue(
  2156. resumeArr[i],
  2157. col,
  2158. me.currentCache[resumeArr[i]][dCode]
  2159. );
  2160. }
  2161. }
  2162. } else {
  2163. for (let col = 0; col < me.setting.header.length; col++) {
  2164. info.sheet.setValue(resumeArr[i], col, "");
  2165. }
  2166. }
  2167. }
  2168. info.sheet.resumePaint();
  2169. }
  2170. if (updateArr.length > 0 || addArr.length > 0) {
  2171. me.mixUpdateRequest(updateArr, addArr, []);
  2172. } else {
  2173. $.bootstrapLoading.end();
  2174. }
  2175. if (updateBasePrcArr.length > 0 && me.rationLibs.length > 0) {
  2176. me.updateRationBasePrcRq(updateBasePrcArr);
  2177. }
  2178. },
  2179. updateRationBasePrcRq: function (basePrcArr, workBook, callback) {
  2180. let me = this;
  2181. me.prevent = true;
  2182. me.calcRation = true;
  2183. if (!$.bootstrapLoading.isLoading()) {
  2184. $.bootstrapLoading.start();
  2185. }
  2186. $.ajax({
  2187. type: "post",
  2188. url: "api/updateRationBasePrc",
  2189. data: {
  2190. basePrcArr: JSON.stringify(basePrcArr),
  2191. repId: pageOprObj.gljLibId,
  2192. },
  2193. dataType: "json",
  2194. success: function (result) {
  2195. me.calcRation = false;
  2196. if (result.error) {
  2197. alert("计算定额基价失败");
  2198. }
  2199. if (workBook) {
  2200. workBook.focus(true);
  2201. } else {
  2202. me.workBook.focus(true);
  2203. }
  2204. me.prevent = false;
  2205. if (callback) {
  2206. callback();
  2207. }
  2208. if ($.bootstrapLoading.isLoading()) {
  2209. $.bootstrapLoading.end();
  2210. }
  2211. },
  2212. });
  2213. },
  2214. mixUpdateRequest: function (updateArr, addArr, removeIds) {
  2215. let me = repositoryGljObj;
  2216. if (updateArr.length > 0) {
  2217. me.saveInString(updateArr);
  2218. }
  2219. if (addArr.length > 0) {
  2220. const codeMap = {};
  2221. const uniqueCodeAddArr = [];
  2222. addArr.forEach((item) => {
  2223. if (!codeMap[item.code]) {
  2224. codeMap[item.code] = 1;
  2225. uniqueCodeAddArr.push(item);
  2226. }
  2227. });
  2228. addArr = uniqueCodeAddArr;
  2229. me.saveInString(addArr);
  2230. }
  2231. $.ajax({
  2232. type: "POST",
  2233. url: "api/mixUpdateGljItems",
  2234. data: {
  2235. repositoryId: me.currentRepositoryId,
  2236. lastOpr: userAccount,
  2237. updateItems: JSON.stringify(updateArr),
  2238. addItems: JSON.stringify(addArr),
  2239. removeIds: JSON.stringify(removeIds),
  2240. },
  2241. dataType: "json",
  2242. cache: false,
  2243. timeout: 50000,
  2244. success: function (result) {
  2245. if (result.error) {
  2246. alert(result.message);
  2247. } else {
  2248. const failCodes = result.data.failCode;
  2249. if (failCodes && failCodes.length) {
  2250. let failText = "";
  2251. failCodes.forEach((code) => {
  2252. failText += `<p>编码“${code}”已存在</p>`;
  2253. });
  2254. $("#alertText").html(failText);
  2255. $("#codeAlert").modal("show");
  2256. }
  2257. const insertData = result.data.insertData;
  2258. me.updateCache(insertData, updateArr, removeIds);
  2259. //me.sortGlj();
  2260. if (me.currentOprParent === 1) {
  2261. me.currentCache = me.getParentCache(
  2262. me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]
  2263. );
  2264. } else {
  2265. me.currentCache = me.getCache();
  2266. }
  2267. me.showGljItems(me.currentCache, me.gljCurTypeId);
  2268. //getCurrentGlj
  2269. let row = me.workBook.getSheet(0).getSelections()[0].row;
  2270. me.currentGlj =
  2271. row < me.currentCache.length ? me.currentCache[row] : null;
  2272. me.currentComponent = me.currentGlj
  2273. ? me.getCurrentComponent(me.currentGlj.component)
  2274. : [];
  2275. sheetCommonObj.cleanData(
  2276. gljComponentOprObj.workBook.getSheet(0),
  2277. gljComponentOprObj.setting,
  2278. -1
  2279. );
  2280. sheetsOprObj.showData(
  2281. gljComponentOprObj,
  2282. gljComponentOprObj.workBook.getSheet(0),
  2283. gljComponentOprObj.setting,
  2284. me.currentComponent
  2285. );
  2286. }
  2287. if (!me.calcRation && $.bootstrapLoading.isLoading()) {
  2288. $.bootstrapLoading.end();
  2289. }
  2290. },
  2291. error: function (err) {
  2292. if ($.bootstrapLoading.isLoading()) {
  2293. $.bootstrapLoading.end();
  2294. }
  2295. console.log(err);
  2296. alert("保存失败");
  2297. },
  2298. });
  2299. },
  2300. saveInString: function (datas) {
  2301. for (let i = 0, len = datas.length; i < len; i++) {
  2302. let data = datas[i];
  2303. if (_exist(data, "basePrice")) {
  2304. data["basePrice"] = data["basePrice"].toString();
  2305. }
  2306. if (_exist(data, "component")) {
  2307. for (let j = 0, jLen = data["component"].length; j < jLen; j++) {
  2308. let comGljObj = data["component"][j];
  2309. if (_exist(comGljObj, "consumeAmt")) {
  2310. comGljObj["consumeAmt"] = comGljObj["consumeAmt"].toString();
  2311. }
  2312. }
  2313. }
  2314. }
  2315. function _exist(data, attr) {
  2316. return data && data[attr] !== undefined && data[attr];
  2317. }
  2318. },
  2319. getParentCache: function (nodes) {
  2320. let me = repositoryGljObj,
  2321. rst = [];
  2322. for (let i = 0; i < me.gljList.length; i++) {
  2323. if (nodes.indexOf(me.gljList[i].gljClass) !== -1) {
  2324. rst.push(me.gljList[i]);
  2325. }
  2326. }
  2327. rst.sort(function (a, b) {
  2328. let rst = 0;
  2329. if (a.code > b.code) rst = 1;
  2330. else if (a.code < b.code) rst = -1;
  2331. return rst;
  2332. });
  2333. return rst;
  2334. },
  2335. getCache: function () {
  2336. let me = this,
  2337. rst = [];
  2338. for (let i = 0; i < me.gljList.length; i++) {
  2339. if (me.gljList[i].gljClass == me.gljCurTypeId) {
  2340. rst.push(me.gljList[i]);
  2341. }
  2342. }
  2343. return rst;
  2344. },
  2345. updateCache: function (insertData, updateArr, removeIds) {
  2346. let me = this,
  2347. cacheSection = me.gljList;
  2348. if (insertData && insertData.length > 0) {
  2349. me.gljList = me.gljList.concat(insertData);
  2350. cacheSection = me.gljList;
  2351. }
  2352. for (let i = removeIds.length - 1; i >= 0; i--) {
  2353. for (let j = cacheSection.length - 1; j >= 0; j--) {
  2354. if (cacheSection[j]["ID"] == removeIds[i]) {
  2355. cacheSection.splice(j, 1);
  2356. }
  2357. }
  2358. }
  2359. /*if (result && result.data && result.data.ops && result.data.ops.length > 0) {
  2360. for (let i = 0; i < result.data.ops.length; i++) {
  2361. for (let j = 0; j < cacheSection.length; j++) {
  2362. if (cacheSection[j]['code'] == result.data.ops[i]['code']) {
  2363. cacheSection[j]["ID"] = result.data.ops[i]["ID"];
  2364. }
  2365. }
  2366. }
  2367. }*/
  2368. for (let i = 0; i < updateArr.length; i++) {
  2369. for (let j = 0; j < cacheSection.length; j++) {
  2370. if (updateArr[i]["ID"] && cacheSection[j]["ID"]) {
  2371. if (cacheSection[j]["ID"] == updateArr[i]["ID"]) {
  2372. cacheSection[j] = updateArr[i];
  2373. }
  2374. } else {
  2375. if (cacheSection[j]["code"] == updateArr[i]["code"]) {
  2376. cacheSection[j] = updateArr[i];
  2377. }
  2378. }
  2379. }
  2380. }
  2381. },
  2382. updateParentNodeIds: function (nodes, caller) {
  2383. let private_build_parentNodeIds = function (pNodeId, nodesArr) {
  2384. let rst = [];
  2385. for (let i = 0; i < nodesArr.length; i++) {
  2386. if (nodesArr[i].children.length > 0) {
  2387. rst = rst.concat(
  2388. private_build_parentNodeIds(
  2389. nodesArr[i].data.ID,
  2390. nodesArr[i].children
  2391. )
  2392. );
  2393. } else {
  2394. rst.push(nodesArr[i].data.ID);
  2395. }
  2396. }
  2397. if (pNodeId && rst.length > 0) {
  2398. caller.parentNodeIds["_pNodeId_" + pNodeId] = rst;
  2399. }
  2400. return rst;
  2401. };
  2402. if (caller.parentNodeIds) {
  2403. private_build_parentNodeIds(null, nodes);
  2404. }
  2405. },
  2406. sortGljDeep: function (datas) {
  2407. function recurCompare(a, b, index) {
  2408. if (a[index] && !b[index]) {
  2409. return 1;
  2410. } else if (!a[index] && b[index]) {
  2411. return -1;
  2412. } else if (a[index] && b[index]) {
  2413. let aV = a[index],
  2414. bV = b[index];
  2415. if (!isNaN(aV) && !isNaN(bV)) {
  2416. aV = parseFloat(a[index]);
  2417. bV = parseFloat(b[index]);
  2418. }
  2419. if (aV > bV) {
  2420. return 1;
  2421. } else if (aV < bV) {
  2422. return -1;
  2423. } else {
  2424. return recurCompare(a, b, index + 1);
  2425. }
  2426. }
  2427. return 0;
  2428. }
  2429. //排序符号-
  2430. datas.sort(function (a, b) {
  2431. let aArr = a.code.split("-"),
  2432. bArr = b.code.split("-");
  2433. return recurCompare(aArr, bArr, 0);
  2434. });
  2435. },
  2436. //工料机排序
  2437. sortGlj: function () {
  2438. let me = this;
  2439. me.gljList.sort(function (a, b) {
  2440. let rst = 0;
  2441. if (a.code > b.code) rst = 1;
  2442. else if (a.code < b.code) rst = -1;
  2443. return rst;
  2444. });
  2445. },
  2446. };
  2447. let gljTypeTreeOprObj = {
  2448. onClick: function (event, treeId, treeNode) {
  2449. let me = repositoryGljObj,
  2450. that = gljComponentOprObj,
  2451. gljTypeId = treeNode.ID;
  2452. me.gljCurTypeId = treeNode.ID;
  2453. me.addGljObj = null;
  2454. sheetCommonObj.cleanSheet(that.workBook.getSheet(0), that.setting, 10);
  2455. if (me.parentNodeIds["_pNodeId_" + treeNode.ID]) {
  2456. me.currentOprParent = 1;
  2457. me.currentCache = me.getParentCache(
  2458. me.parentNodeIds["_pNodeId_" + treeNode.ID]
  2459. );
  2460. me.workBook.getSheet(0).setRowCount(me.currentCache.length);
  2461. } else {
  2462. me.currentOprParent = 0;
  2463. me.currentCache = me.getCache();
  2464. }
  2465. me.showGljItems(me.currentCache, gljTypeId);
  2466. },
  2467. beforeRename: function (treeId, treeNode, newName, isCancel) {
  2468. if (newName.length == 0) {
  2469. return false;
  2470. }
  2471. return true;
  2472. },
  2473. onRename: function (e, treeId, treeNode, isCancel) {
  2474. let nodes = [];
  2475. nodes.push(treeNode);
  2476. gljTypeTreeOprObj.updateNodes(nodes);
  2477. },
  2478. onBeforeRemove: function (treeId, treeNode) {
  2479. let me = this;
  2480. if (treeNode.ParentID == -1 && treeNode.isFirstNode) {
  2481. alert("不允许删除全部!");
  2482. return false;
  2483. }
  2484. if (!confirm("您确定要删除此节点及所有子节点的数据?删除后不可恢复!")) {
  2485. return false;
  2486. }
  2487. let nodeIds = [],
  2488. preNode = treeNode.getPreNode(),
  2489. preNodeId = -1;
  2490. if (preNode) {
  2491. preNodeId = preNode.ID;
  2492. }
  2493. private_fetchAllSubItems = function (pItem) {
  2494. nodeIds.push(pItem.ID);
  2495. if (pItem.items && pItem.items.length > 0) {
  2496. for (let i = 0; i < pItem.items.length; i++) {
  2497. private_fetchAllSubItems(pItem.items[i]);
  2498. }
  2499. }
  2500. };
  2501. nodeIds.push(treeNode.ID);
  2502. for (let i = 0; i < treeNode.items.length; i++) {
  2503. private_fetchAllSubItems(treeNode.items[i]);
  2504. }
  2505. $.ajax({
  2506. type: "POST",
  2507. url: "api/deleteGljNodes",
  2508. data: {
  2509. repId: pageOprObj.gljLibId,
  2510. lastOpr: userAccount,
  2511. nodes: JSON.stringify(nodeIds),
  2512. preNodeId: preNodeId,
  2513. preNodeNextId: treeNode.NextSiblingID,
  2514. },
  2515. dataType: "json",
  2516. cache: false,
  2517. timeout: 5000,
  2518. success: function (result, textStatus, status) {
  2519. let pNode = treeNode.getParentNode();
  2520. if (pNode && pNode.items && pNode.items.length == 1) {
  2521. pNode.isParent = false;
  2522. }
  2523. },
  2524. error: function () { },
  2525. });
  2526. return true;
  2527. },
  2528. onRemove: function (e, treeId, treeNode) {
  2529. let me = repositoryGljObj,
  2530. pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
  2531. if (pNode && pNode.items && pNode.items.length == 0) {
  2532. pNode.isParent = false;
  2533. me.treeObj.refresh();
  2534. }
  2535. },
  2536. updateNodes: function (nodes) {
  2537. if (nodes && nodes.length > 0) {
  2538. let reqData = [];
  2539. for (let i = 0; i < nodes.length; i++) {
  2540. let node = {};
  2541. node.repositoryId = nodes[i].repositoryId;
  2542. node.ID = nodes[i].ID;
  2543. node.ParentID = nodes[i].ParentID;
  2544. node.NextSiblingID = nodes[i].NextSiblingID;
  2545. node.Name = nodes[i].Name;
  2546. reqData.push(node);
  2547. }
  2548. $.ajax({
  2549. type: "POST",
  2550. url: "api/updateGljNodes",
  2551. data: {
  2552. repId: pageOprObj.gljLibId,
  2553. lastOpr: userAccount,
  2554. nodes: JSON.stringify(reqData),
  2555. },
  2556. dataType: "json",
  2557. cache: false,
  2558. timeout: 5000,
  2559. success: function (result, textStatus, status) {
  2560. console.log(status + " : " + result);
  2561. },
  2562. error: function () { },
  2563. });
  2564. }
  2565. },
  2566. addRootNode: function () {
  2567. let me = repositoryGljObj,
  2568. rawNode = { ParentID: -1, NextSiblingID: -1, Name: "所有" },
  2569. lastNodeId = -1;
  2570. if (me.treeObj) {
  2571. let rootNodes = me.treeObj.getNodes();
  2572. if (rootNodes.length == 0) {
  2573. gljTypeTreeOprObj.addNewNode(rawNode, lastNodeId, function (err, rst) {
  2574. if (!err) {
  2575. let newNodes = [],
  2576. isSilent = false;
  2577. newNodes.push({
  2578. repositoryId: rst.data.repositoryId,
  2579. ID: rst.data.ID,
  2580. ParentID: rst.data.ParentID,
  2581. NextSiblingID: -1,
  2582. Name: "所有",
  2583. isParent: false,
  2584. items: [],
  2585. });
  2586. me.treeObj.addNodes(null, -1, newNodes, isSilent);
  2587. }
  2588. });
  2589. }
  2590. }
  2591. },
  2592. addNewNode: function (rawNode, lastNodeId, callback) {
  2593. $.ajax({
  2594. type: "POST",
  2595. url: "api/createNewGljTypeNode",
  2596. data: {
  2597. lastOpr: userAccount,
  2598. repositoryId: repositoryGljObj.currentRepositoryId,
  2599. lastNodeId: lastNodeId,
  2600. rawNodeData: JSON.stringify(rawNode),
  2601. },
  2602. dataType: "json",
  2603. cache: false,
  2604. timeout: 1000,
  2605. success: function (result, textStatus, status) {
  2606. callback(false, result);
  2607. },
  2608. error: function (err) {
  2609. callback(err);
  2610. },
  2611. });
  2612. },
  2613. addHoverDom: function (treeId, treeNode) {
  2614. if (typeof treeNode.doing !== "undefined" && treeNode.doing) {
  2615. return false;
  2616. }
  2617. hoverOpr();
  2618. function hoverOpr() {
  2619. let me = repositoryGljObj,
  2620. sObj = $("#" + treeNode.tId + "_span");
  2621. if (treeNode.editNameFlag || $("#addBtn_" + treeNode.tId).length > 0)
  2622. return;
  2623. let addStr =
  2624. "<span class='button add' id='addBtn_" +
  2625. treeNode.tId +
  2626. "' title='新增子节点' onfocus='this.blur();'></span>";
  2627. sObj.after(addStr);
  2628. let btn = $("#addBtn_" + treeNode.tId);
  2629. if (btn)
  2630. btn.bind("click", function () {
  2631. treeNode.doing = true;
  2632. let rawNode = {
  2633. ParentID: treeNode.ID,
  2634. NextSiblingID: -1,
  2635. Name: "新增子节点",
  2636. },
  2637. lastNodeId = -1;
  2638. if (treeNode.items.length > 0) {
  2639. lastNodeId = treeNode.items[treeNode.items.length - 1].ID;
  2640. }
  2641. gljTypeTreeOprObj.addNewNode(
  2642. rawNode,
  2643. lastNodeId,
  2644. function (err, rst) {
  2645. if (!err) {
  2646. let newNodes = [],
  2647. isSilent = false;
  2648. if (treeNode.items.length > 0) {
  2649. treeNode.items[treeNode.items.length - 1].NextSiblingID =
  2650. rst.data.ID;
  2651. }
  2652. newNodes.push({
  2653. repositoryId: rst.data.repositoryId,
  2654. ID: rst.data.ID,
  2655. ParentID: rst.data.ParentID,
  2656. NextSiblingID: -1,
  2657. Name: "新增子节点",
  2658. isParent: false,
  2659. items: [],
  2660. });
  2661. treeNode.isParent = true;
  2662. if (me.treeObj) {
  2663. me.treeObj.addNodes(treeNode, -1, newNodes, isSilent);
  2664. } else {
  2665. me.treeObj = $.fn.zTree.init(
  2666. $("#rationChapterTree"),
  2667. gljSetting,
  2668. newNodes
  2669. );
  2670. }
  2671. treeNode.doing = false;
  2672. hoverOpr();
  2673. }
  2674. }
  2675. );
  2676. });
  2677. }
  2678. },
  2679. removeHoverDom: function (treeId, treeNode) {
  2680. $("#addBtn_" + treeNode.tId)
  2681. .unbind()
  2682. .remove();
  2683. },
  2684. };
  2685. const setTimeoutSync = (handle, time) => {
  2686. return new Promise((resolve, reject) => {
  2687. setTimeout(() => {
  2688. try {
  2689. if (handle && typeof handle === "function") {
  2690. handle();
  2691. }
  2692. resolve();
  2693. } catch (err) {
  2694. reject(err);
  2695. }
  2696. }, time);
  2697. });
  2698. };
  2699. setTimeoutSync(() => {
  2700. //throw new Error('a');
  2701. })
  2702. .then((v) => {
  2703. setTimeoutSync(() => {
  2704. //Promise.reject(new Error('b'))
  2705. //throw new Error('b');
  2706. });
  2707. })
  2708. .catch((err) => console.log(err));
  2709. $(document).ready(function () {
  2710. let moduleName = "stdGLj";
  2711. function refreshALlWorkBook() {
  2712. if (gljClassTreeObj.workBook) {
  2713. gljClassTreeObj.workBook.refresh();
  2714. }
  2715. if (repositoryGljObj.workBook) {
  2716. repositoryGljObj.workBook.refresh();
  2717. }
  2718. if (gljComponentOprObj.workBook) {
  2719. gljComponentOprObj.workBook.refresh();
  2720. }
  2721. }
  2722. SlideResize.loadHorizonWidth(
  2723. moduleName,
  2724. [$("#slideResizeLeft"), $("#slideResizeRight")],
  2725. [$("#leftContent"), $("#midContent"), $("#rightContent")],
  2726. function () {
  2727. refreshALlWorkBook();
  2728. }
  2729. );
  2730. //章节树与人材机表
  2731. let leftElesObj = {};
  2732. leftElesObj.module = moduleName;
  2733. leftElesObj.resize = $("#slideResizeLeft");
  2734. leftElesObj.parent = $("#dataRow");
  2735. leftElesObj.left = $("#leftContent");
  2736. leftElesObj.right = $("#midContent");
  2737. SlideResize.horizontalSlide(
  2738. leftElesObj,
  2739. {
  2740. min: 200,
  2741. max: `$('#dataRow').width() - $('#rightContent').width() - 200`,
  2742. },
  2743. function () {
  2744. refreshALlWorkBook();
  2745. }
  2746. );
  2747. //人材机表与人材机组成物表
  2748. let rightElesObj = {};
  2749. rightElesObj.module = moduleName;
  2750. rightElesObj.resize = $("#slideResizeRight");
  2751. rightElesObj.parent = $("#dataRow");
  2752. rightElesObj.left = $("#midContent");
  2753. rightElesObj.right = $("#rightContent");
  2754. SlideResize.horizontalSlide(
  2755. rightElesObj,
  2756. {
  2757. min: 200,
  2758. max: `$('#dataRow').width() - $('#leftContent').width() - 200`,
  2759. },
  2760. function () {
  2761. let resizeRate =
  2762. (SlideResize.resizeWidth * 100) / $("#midContent").width(),
  2763. sheetRate = 100 - resizeRate;
  2764. $("#slideResizeLeft").css("width", `${resizeRate}%`);
  2765. $("#GLJListSheet").css("width", `${sheetRate}%`);
  2766. refreshALlWorkBook();
  2767. }
  2768. );
  2769. $("#moveToConfirm").click(function () {
  2770. let sheet = repositoryGljObj.workBook.getSheet(0);
  2771. let sel = sheet.getSelections()[0];
  2772. let gljs = repositoryGljObj.currentCache.slice(
  2773. sel.row,
  2774. sel.row + sel.rowCount
  2775. );
  2776. let node = gljClassTreeObj.zTreeSetting.selected;
  2777. let updateArr = [];
  2778. for (let glj of gljs) {
  2779. const data = _.cloneDeep(glj);
  2780. data.gljClass = node.ID;
  2781. updateArr.push(data);
  2782. }
  2783. repositoryGljObj.mixUpdateRequest(updateArr, [], []);
  2784. $("#moveTo").modal("hide");
  2785. });
  2786. // 修改编号弹窗
  2787. $('#edit-code').on('shown.bs.modal', function () {
  2788. $('#edit-code-text').focus();
  2789. });
  2790. $('#edit-code-confirm').click(async () => {
  2791. await repositoryGljObj.editCode();
  2792. });
  2793. });