glj.js 88 KB

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