ScBigProjManageView.pas 170 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235
  1. unit ScBigProjManageView;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, JimPages, ZJGrid, ExtCtrls, ComCtrls, ProjectsDM, ZjTrees,
  6. ActnList, ImgList, ZJGridTrees, ExTreeView, JimTabs, ToolWin, StdCtrls,
  7. JimLabels, ZjGridDBA, DB, ZjGridTreeDBA, ZJEdits, Menus, ScConsts,
  8. xmldom, XMLIntf, msxmldom, XMLDoc, Buttons, sdGridDBA, sdGridTreeDBA,
  9. ScProjManagerTree, dxBar, CheckLst;
  10. type
  11. TBuildProjExpandType = (bpetFolder, bpetBuildProj, bpetTender);
  12. const
  13. arrBuildProjExpandStr: array [TBuildProjExpandType] of string = ('文件夹', '建设项目', '分段文件');
  14. type
  15. TScfrmBigProjManage = class(TFrame)
  16. Splitter1: TSplitter;
  17. ilstProject: TImageList;
  18. alstProject: TActionList;
  19. actnNewBP: TAction;
  20. actnImportBP: TAction;
  21. actnDelBP: TAction;
  22. actnNew: TAction;
  23. actnInsert: TAction;
  24. actnOpen: TAction;
  25. actnGatherProjects: TAction;
  26. actnAuditProject: TAction;
  27. actnBPCopyTo: TAction;
  28. actnCopyProject: TAction;
  29. actnEditBPName: TAction;
  30. ztRelaFiles: TZjGridTree;
  31. odImport: TOpenDialog;
  32. sdExport: TSaveDialog;
  33. odOpenFiles: TOpenDialog;
  34. pnlBuildProjects: TPanel;
  35. pnlFiles: TPanel;
  36. tbBuildProject: TToolBar;
  37. tbNewBP: TToolButton;
  38. tbImport: TToolButton;
  39. tbExport: TToolButton;
  40. tbDelBP: TToolButton;
  41. zgBuildProjects: TZJGrid;
  42. dtpEditDate: TDateTimePicker;
  43. tobtn1: TToolButton;
  44. tbRenameBP: TToolButton;
  45. actnImportProject: TAction;
  46. actnNewFeeFile: TAction;
  47. actnNewPriceFile: TAction;
  48. actnImportRelaFile: TAction;
  49. actnExportRelaFile: TAction;
  50. actnRenameRelaFile: TAction;
  51. actnDelRelaFile: TAction;
  52. actnCopyRelaFile: TAction;
  53. ppmExportProject: TPopupMenu;
  54. actnExportSingleProject: TAction;
  55. pmiExportSingleProject: TMenuItem;
  56. actnSaveAs: TAction;
  57. actnSaveAsRelaFile: TAction;
  58. pmStaticBills: TPopupMenu;
  59. N1: TMenuItem;
  60. N2: TMenuItem;
  61. N3: TMenuItem;
  62. N4: TMenuItem;
  63. actnOwnerImport: TAction;
  64. actnOwnerExport: TAction;
  65. actnBidderImport: TAction;
  66. actnBidderExport: TAction;
  67. tobtn2: TToolButton;
  68. pnlFindPB: TPanel;
  69. edtFindBP: TEdit;
  70. btnFindNext: TSpeedButton;
  71. staBuildProjects: TsdGridTreeDBA;
  72. actnNewFolder: TAction;
  73. actnOpenHistoryDir: TAction;
  74. pmNew: TPopupMenu;
  75. N5: TMenuItem;
  76. N7: TMenuItem;
  77. N8: TMenuItem;
  78. actnNewSubFolder: TAction;
  79. tbStaticBills: TToolButton;
  80. ilstBtn: TImageList;
  81. actnImport: TAction;
  82. actnExport: TAction;
  83. pmImport: TPopupMenu;
  84. miImportTender: TMenuItem;
  85. actnNewTender: TAction;
  86. actnExportBP: TAction;
  87. tbOpenTender: TToolButton;
  88. btn1: TToolButton;
  89. pnlShowLevel: TPanel;
  90. cbExpandTo: TComboBox;
  91. jpcPropties: TJimPageControl;
  92. jpcProptiesTender: TJimPage;
  93. jpcProptiesBuildProject: TJimPage;
  94. Panel4: TPanel;
  95. JimGradLabel4: TJimGradLabel;
  96. zgProperties: TZJGrid;
  97. cbbProperties: TZjComboBox;
  98. cbbProfit: TZjComboBox;
  99. pnlBPPropties: TPanel;
  100. Panel1: TPanel;
  101. JimGradLabel1: TJimGradLabel;
  102. Panel2: TPanel;
  103. Panel5: TPanel;
  104. Label1: TLabel;
  105. cbbGatherOtherFee: TComboBox;
  106. Panel3: TPanel;
  107. JimGradLabel3: TJimGradLabel;
  108. ToolBar1: TToolBar;
  109. tbNewFeeFile: TToolButton;
  110. tbNewUnitPriceFile: TToolButton;
  111. tbImportRelaFile: TToolButton;
  112. tbExportRelaFile: TToolButton;
  113. tbCopyRelaFile: TToolButton;
  114. tbSaveAsRelaFile: TToolButton;
  115. tbRenameRelaFile: TToolButton;
  116. ToolButton10: TToolButton;
  117. tbDeleteRelaFile: TToolButton;
  118. zgRelaFiles: TZJGrid;
  119. Splitter2: TSplitter;
  120. zgProjectsByBP: TZJGrid;
  121. sdProjectsByBP: TsdGridDBA;
  122. Label2: TLabel;
  123. edtGatherCoe: TEdit;
  124. cbbProgressiveFile: TComboBox;
  125. Label3: TLabel;
  126. Panel6: TPanel;
  127. btnCalculateBuildProject: TButton;
  128. Label4: TLabel;
  129. actnCalculateBuildProject: TAction;
  130. Label5: TLabel;
  131. cbbSiteConstructType: TComboBox;
  132. jpcBuildProjectProperties: TJimPageControl;
  133. jpcBuildProjectPropertiesBasic: TJimPage;
  134. jpcBuildProjectPropertiesZhaoBiao: TJimPage;
  135. jpcBuildProjectPropertiesTouBiao: TJimPage;
  136. jpcBuildProjectPropertiesRelaFiles: TJimPage;
  137. zgBPBasic: TZJGrid;
  138. zgBPZhaoBiao: TZJGrid;
  139. zgBPTouBiao: TZJGrid;
  140. procedure actnOpenUpdate(Sender: TObject);
  141. procedure actnNewBPExecute(Sender: TObject);
  142. procedure actnImportBPUpdate(Sender: TObject);
  143. procedure actnDelBPExecute(Sender: TObject);
  144. procedure actnBPCopyToExecute(Sender: TObject);
  145. procedure actnEditBPNameExecute(Sender: TObject);
  146. procedure actnNewExecute(Sender: TObject);
  147. procedure actnInsertExecute(Sender: TObject);
  148. procedure actnOpenExecute(Sender: TObject);
  149. procedure zgRelaFilesCellCanEdit(Sender: TObject; const ACoord: TPoint;
  150. var Allow: Boolean);
  151. procedure zgRelaFilesCellGetColor(Sender: TObject; ACoord: TPoint;
  152. var AColor: TColor);
  153. procedure zgPropertiesCellCanEdit(Sender: TObject;
  154. const ACoord: TPoint; var Allow: Boolean);
  155. procedure zgPropertiesCellGetColor(Sender: TObject; ACoord: TPoint;
  156. var AColor: TColor);
  157. procedure actnImportProjectExecute(Sender: TObject);
  158. procedure actnImportProjectUpdate(Sender: TObject);
  159. procedure actnCopyProjectExecute(Sender: TObject);
  160. procedure actnNewFeeFileExecute(Sender: TObject);
  161. procedure actnNewPriceFileExecute(Sender: TObject);
  162. procedure actnNewFeeFileUpdate(Sender: TObject);
  163. procedure actnExportRelaFileUpdate(Sender: TObject);
  164. procedure actnExportRelaFileExecute(Sender: TObject);
  165. procedure zgBuildProjectsDrawCellText(ACanvas: TCanvas;
  166. const ARect: TRect; const ACoord: TPoint; AGrid: TZJGrid;
  167. const Text: String; var ADefaultDraw: Boolean);
  168. procedure actnImportRelaFileExecute(Sender: TObject);
  169. procedure zgPropertiesCellTextChanged(Sender: TObject; Col,
  170. Row: Integer);
  171. procedure zgPropertiesCellButtonClick(Sender: TObject; Col,
  172. Row: Integer);
  173. procedure actnDelRelaFileUpdate(Sender: TObject);
  174. procedure actnDelRelaFileExecute(Sender: TObject);
  175. procedure actnRenameRelaFileUpdate(Sender: TObject);
  176. procedure actnRenameRelaFileExecute(Sender: TObject);
  177. procedure zgRelaFilesCellTextChanged(Sender: TObject; Col,
  178. Row: Integer);
  179. procedure zgRelaFilesCellTextChanging(Sender: TObject;
  180. const ACoord: TPoint; var NewValue: String; var Accept: Boolean);
  181. procedure zgPropertiesGetCellEditor(Sender: TObject; ACoord: TPoint;
  182. var AControl: TWinControl);
  183. procedure zgPropertiesEditorLoadCell(Sender: TObject; ACoord: TPoint;
  184. AControl: TWinControl);
  185. procedure zgPropertiesEditorSaveCell(Sender: TObject; ACoord: TPoint;
  186. AControl: TWinControl);
  187. procedure actnExportSingleProjectExecute(Sender: TObject);
  188. procedure actnSaveAsExecute(Sender: TObject);
  189. procedure actnSaveAsRelaFileExecute(Sender: TObject);
  190. procedure zgRelaFilesGetCellText(Sender: TObject; const ACoord: TPoint;
  191. var Value: String; DisplayText: Boolean);
  192. procedure actnOwnerExportExecute(Sender: TObject);
  193. procedure actnOwnerImportExecute(Sender: TObject);
  194. procedure actnBidderExportExecute(Sender: TObject);
  195. procedure actnBidderImportExecute(Sender: TObject);
  196. procedure zgPropertiesMouseDown(Sender: TObject; Button: TMouseButton;
  197. Shift: TShiftState; X, Y: Integer);
  198. procedure zgPropertiesKeyDown(Sender: TObject; var Key: Word;
  199. Shift: TShiftState);
  200. procedure zgBuildProjectsCellTextChanging(Sender: TObject;
  201. const ACoord: TPoint; var NewValue: String; var Accept: Boolean);
  202. procedure zgBuildProjectsPaste(Sender: TObject; const ABounds: TRect;
  203. var Allow: Boolean);
  204. procedure zgRelaFilesPaste(Sender: TObject; const ABounds: TRect;
  205. var Allow: Boolean);
  206. procedure zgPropertiesCellTextChanging(Sender: TObject;
  207. const ACoord: TPoint; var NewValue: String; var Accept: Boolean);
  208. procedure edtFindBPChange(Sender: TObject);
  209. procedure btnFindNextClick(Sender: TObject);
  210. procedure zgBuildProjectsEditorLoadCell(Sender: TObject;
  211. ACoord: TPoint; AControl: TWinControl);
  212. procedure zgBuildProjectsEditorSaveCell(Sender: TObject;
  213. ACoord: TPoint; AControl: TWinControl);
  214. procedure zgBuildProjectsGetCellEditor(Sender: TObject; ACoord: TPoint;
  215. var AControl: TWinControl);
  216. procedure actnNewFolderExecute(Sender: TObject);
  217. procedure actnDelBPUpdate(Sender: TObject);
  218. procedure actnOpenHistoryDirExecute(Sender: TObject);
  219. procedure zgBuildProjectsCellCanEdit(Sender: TObject;
  220. const ACoord: TPoint; var Allow: Boolean);
  221. procedure zgBuildProjectsShowHint(var HintStr: String;
  222. var CanShow: Boolean; var HintInfo: THintInfo; const ACoord: TPoint);
  223. procedure actnNewSubFolderExecute(Sender: TObject);
  224. procedure actnNewSubFolderUpdate(Sender: TObject);
  225. procedure zgBuildProjectsMouseDown(Sender: TObject;
  226. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  227. procedure actnNewFolderUpdate(Sender: TObject);
  228. procedure zgBuildProjectsCellGetColor(Sender: TObject; ACoord: TPoint;
  229. var AColor: TColor);
  230. procedure actnExportUpdate(Sender: TObject);
  231. procedure actnExportExecute(Sender: TObject);
  232. procedure actnImportExecute(Sender: TObject);
  233. procedure actnImportBPExecute(Sender: TObject);
  234. procedure actnNewTenderUpdate(Sender: TObject);
  235. procedure actnExportBPExecute(Sender: TObject);
  236. procedure actnExportBPUpdate(Sender: TObject);
  237. procedure cbExpandToChange(Sender: TObject);
  238. procedure actnEditBPNameUpdate(Sender: TObject);
  239. procedure zgPropertiesCanEditAcceptKey(var AKey: Char;
  240. var Accept: Boolean);
  241. procedure actnOwnerImportUpdate(Sender: TObject);
  242. procedure zgRelaFilesMouseDown(Sender: TObject; Button: TMouseButton;
  243. Shift: TShiftState; X, Y: Integer);
  244. procedure actnOwnerExportUpdate(Sender: TObject);
  245. procedure actnNewUpdate(Sender: TObject);
  246. procedure actnImportUpdate(Sender: TObject);
  247. procedure tbtnTestClick(Sender: TObject);
  248. procedure zgBuildProjectsGetCellText(Sender: TObject;
  249. const ACoord: TPoint; var Value: String; DisplayText: Boolean);
  250. procedure zgProjectsByBPCellCanEdit(Sender: TObject;
  251. const ACoord: TPoint; var Allow: Boolean);
  252. procedure edtGatherCoeKeyPress(Sender: TObject; var Key: Char);
  253. procedure edtGatherCoeChange(Sender: TObject);
  254. procedure cbbGatherOtherFeeSelect(Sender: TObject);
  255. procedure cbbProgressiveFileSelect(Sender: TObject);
  256. procedure actnCalculateBuildProjectUpdate(Sender: TObject);
  257. procedure actnCalculateBuildProjectExecute(Sender: TObject);
  258. procedure cbbSiteConstructTypeSelect(Sender: TObject);
  259. procedure zgBPBasicCellCanEdit(Sender: TObject; const ACoord: TPoint;
  260. var Allow: Boolean);
  261. procedure zgBPZhaoBiaoCellCanEdit(Sender: TObject;
  262. const ACoord: TPoint; var Allow: Boolean);
  263. procedure zgBPTouBiaoCellCanEdit(Sender: TObject; const ACoord: TPoint;
  264. var Allow: Boolean);
  265. procedure zgBPBasicCellTextChanged(Sender: TObject; Col, Row: Integer);
  266. procedure zgBPBasicCellGetColor(Sender: TObject; ACoord: TPoint;
  267. var AColor: TColor);
  268. procedure zgBPZhaoBiaoCellGetColor(Sender: TObject; ACoord: TPoint;
  269. var AColor: TColor);
  270. procedure zgBPTouBiaoCellGetColor(Sender: TObject; ACoord: TPoint;
  271. var AColor: TColor);
  272. procedure zgBPBasicGetCellEditor(Sender: TObject; ACoord: TPoint;
  273. var AControl: TWinControl);
  274. procedure zgBPBasicEditorLoadCell(Sender: TObject; ACoord: TPoint;
  275. AControl: TWinControl);
  276. procedure zgBPBasicEditorSaveCell(Sender: TObject; ACoord: TPoint;
  277. AControl: TWinControl);
  278. procedure zgBPZhaoBiaoCellTextChanged(Sender: TObject; Col,
  279. Row: Integer);
  280. procedure zgBPTouBiaoCellTextChanged(Sender: TObject; Col,
  281. Row: Integer);
  282. private
  283. { Private declarations }
  284. FProjectParent, FFeeParent, FPriceParent, FRationParent: TZjTreeNode;
  285. FActive: Boolean;
  286. FManageProjects: TManageProjects;
  287. FIsLoading: Boolean;
  288. FIsPropLoading: Boolean;
  289. FCurProjIsStaticBills: Boolean; //当前分段是否是固化清单
  290. procedure SetActive(const Value: Boolean);
  291. procedure InitViews;
  292. procedure ClearRelaFilesView;
  293. procedure RefreshProjectView(ABuildProjectID: Integer = -1);
  294. procedure RefreshPropertyView;
  295. procedure RefreshBuildProjectPropertyView(ABuildProjectID: Integer);
  296. procedure ExportBuildProject(ABuildProjectID: Integer;
  297. ABuildProjectName, AFileName: string);
  298. function FindFeeTaxFile(AProjectID: Integer): string;
  299. function NewRelaFileDisplayName(AName: string): string;
  300. function GetRelaFileName(ADisplayName: string): string;
  301. function ImportBuildProjectIfNotExists(ABuildProjName: string): Boolean;
  302. function ImportBudgetProject(const ABudgetProjFile: string): Boolean;
  303. function ExportBudgetProject(AID: Integer; const ABuildProject, AProjectName,
  304. ASourceFile, ABudgetProjFile: string): Boolean;
  305. // 固化清单 GiLi
  306. // 固化清单 属性Grid 判断当前行是否允许编辑
  307. function IsPropertyCanEdit(const ACoord: TPoint): Boolean;
  308. // 固化清单 导入导出
  309. procedure ExportStaticBills(ANewAlias: string = ''; AIsOwner: Boolean = False);
  310. procedure ImportStaticBills(const AFileName: string; AIsOwner: Boolean = False);
  311. // 固化清单 打开之前 先转换成新的smb文件
  312. procedure NewGUIDToNewSmpFile(AFileName: string);
  313. function GetFileGUID(AFileName: string): string;
  314. // 当从源文件导出固化清单的时候,标记源文件已经导出过固化清单
  315. procedure SetExportedStaticBillsFlag(AFileName: string; AIsExported: Integer);
  316. // 判断源文件是否导出过固化清单
  317. function IsFileHadExportedStaticBills(AFileName: string): Boolean;
  318. procedure SearchBuildProject(AProjectName: string; AFromHead: Boolean = True);
  319. function VerifySBP(ABuildProject, AFileName: string): Boolean;
  320. procedure ExpandTo(AType: TBuildProjExpandType);
  321. function CurBuildProjID: Integer;
  322. procedure SetShowFiles(const Value: Boolean);
  323. function GetShowFiles: Boolean;
  324. procedure ExportCurrentRelaFile(ASave: Boolean);
  325. procedure ExportCurrentProjectFile(ASave: Boolean);
  326. procedure SaveAsRelaFile(ABPID: Integer; AFileName, ANewName, AOldName: string;
  327. AType: Integer; ACheckExist: Boolean);
  328. procedure SaveAsRelaFilesByProject(ABPID: Integer;
  329. AOldTenderNode, ANewTenderNode: TScProjManagerTreeNode);
  330. function CanSaveAsRelaFilesByProject(ATenderNode: TScProjManagerTreeNode): Boolean;
  331. procedure DoOnExportProjectXML(Sender: TObject);
  332. procedure ImportBPProperties(ABuildProjectID: Integer; AProperties: TStrings);
  333. procedure ExportBPProperties(ABuildProjectID: Integer; AProperties: TStrings);
  334. public
  335. { Public declarations }
  336. // 判断是否是从业主的源文件导出的 固化清单
  337. function IsOwnerStaticBills(AFileName: string): Boolean;
  338. constructor Create(AOwner: TComponent); override;
  339. procedure Init(AManageProjects: TManageProjects);
  340. procedure BatchExportBuildProject;
  341. procedure ImportAndOpenBudgetProject(ABuildProjName, ABudgetProjFile: string); overload;
  342. procedure ImportBP(const AFileName: string);
  343. procedure ExportCurBuildProject(const AFileName: string);
  344. procedure ExpXML_QG;
  345. procedure ExpXML_ZJ;
  346. function CurSelNodeIsBP: Boolean;
  347. function GetCurrentBPName: string;
  348. function GetCurrentFullBuildProjectName: string;
  349. function OpenAllBudgetProjectOfCurrentBP: TScProjType;
  350. procedure OpenAllProjectsOfCurBP(var AList: TList);
  351. procedure ExtractBudgetProjectNames(AStrings: TStrings);
  352. procedure ImportXML_KM; // 单标段模式,淘汰。
  353. procedure ImportXML_QG;
  354. procedure ImportXML_ZheJiang;
  355. procedure RefreshInfoView;
  356. function SelectedBuildProject: Boolean;
  357. function GetSmartProjType: Integer;
  358. // 建设项目造价计算
  359. function CanCalculateCurrentBP: Boolean;
  360. procedure CalculateCurrentBP;
  361. function NeedBatchCalc: Boolean;
  362. property Active: Boolean read FActive write SetActive;
  363. property ShowFiles: Boolean read GetShowFiles write SetShowFiles;
  364. end;
  365. implementation
  366. uses
  367. ScUtils, ZjIDTree, ScConfig, ScBuildProjectSaverUnit, ScGLJLibs,
  368. ScMainFrm, ZjCells, ScProjBaseDM, ScProjList, ScFileArchiver, ScFileArchiverConsts,
  369. ScFeeRateLibsUnit, ScUnitPriceLibsUnit, Math, ScBrowseRelaFilesFrm,
  370. ScExportBuildProjectsFrm, ScSelectProjectPackageFilesFrm, ScXMLPort, ScProjFrm,
  371. {$IFDEF _CostService}csParams, {$ENDIF}
  372. ScCustomMachineDM, ScSelectBuildProjectsFrm, ComObj, ScTypes, ScStaticBills, ScProgressFrm, DBClient,
  373. sdDB, sdIDTree, ShellAPI, ScSaveAsFileFrm, ScEncryptEditions, ScCommonFeeDM, ScProject, ScTenderKindSelectFrm,
  374. ScXMLToBuildProject, ScImportZheJiangXMLFrm, DateUtils;
  375. {$R *.dfm}
  376. { TScBigProjManageFrm }
  377. const
  378. C_Indent = ' ';
  379. constructor TScfrmBigProjManage.Create(AOwner: TComponent);
  380. begin
  381. inherited;
  382. pnlBuildProjects.Width := Max(Screen.Width - 740, 200);
  383. //pnlFiles.Width := Screen.Width * 3 div 10;
  384. //pnlProperties.Width := 325;//Screen.Width * 3 div 10;
  385. FIsLoading := False;
  386. FIsPropLoading := False;
  387. // 固化清单
  388. FCurProjIsStaticBills := False;
  389. // 固化清单 界面控制
  390. if _IsFixedBills then
  391. tbStaticBills.Visible := True
  392. else
  393. tbStaticBills.Visible := False;
  394. if _IsAreaExe then
  395. begin
  396. actnNew.Visible := False;
  397. actnImportBP.Visible := False;
  398. actnImportProject.Visible := False;
  399. end;
  400. ShowFiles := True;
  401. end;
  402. procedure TScfrmBigProjManage.Init(AManageProjects: TManageProjects);
  403. procedure InitExpandTo;
  404. var
  405. bType: TBuildProjExpandType;
  406. begin
  407. cbExpandTo.Items.Clear;
  408. for bType := Low(arrBuildProjExpandStr) to high(arrBuildProjExpandStr) do
  409. cbExpandTo.Items.Add(arrBuildProjExpandStr[bType]);
  410. bType := TBuildProjExpandType(ConfigInfo.BuildProjExpandLevel);
  411. cbExpandTo.ItemIndex := Integer(bType);
  412. ExpandTo(bType);
  413. end;
  414. begin
  415. FIsLoading := True;
  416. InitViews;
  417. FManageProjects := AManageProjects;
  418. FManageProjects.RefreshInfo := RefreshInfoView;
  419. staBuildProjects.IDTree := FManageProjects.ManagerTree;
  420. sdProjectsByBP.DataView := FManageProjects.sdvProjectsByBP;
  421. FIsLoading := False;
  422. RefreshInfoView;
  423. InitExpandTo;
  424. if (FManageProjects.ManagerTree.Selected = nil) and (FManageProjects.ManagerTree.Count > 0) then
  425. begin
  426. FManageProjects.ManagerTree.SelectedIndex := 0;
  427. if FManageProjects.ManagerTree.Selected <> nil then
  428. FManageProjects.ManagerTree.Selected.LocateInControl;
  429. end;
  430. end;
  431. procedure TScfrmBigProjManage.InitViews;
  432. var
  433. Node, Child: TZjTreeNode;
  434. begin
  435. //pnlRelaFiles.Height := Screen.Height * 2 div 6;
  436. jpcPropties.ShowTabs := False;
  437. {$IFDEF _ScNoFeeRate}
  438. tbNewFeeFile.Visible := False;
  439. {$ENDIF}
  440. // 建设项目
  441. {zgBuildProjects.Cells[1, 0].Text := '名称';
  442. zgBuildProjects.Cells[2, 0].Text := '编制';
  443. zgBuildProjects.Cells[3, 0].Text := '日期';
  444. zgBuildProjects.Cells[4, 0].Text := '审核';
  445. zgBuildProjects.Cells[5, 0].Text := '负责';
  446. zgBuildProjects.ColWidths[1] := 300;
  447. zgBuildProjects.ColWidths[2] := 100;
  448. zgBuildProjects.ColWidths[3] := 100;
  449. zgBuildProjects.ColWidths[4] := 100;
  450. zgBuildProjects.ColWidths[5] := 100;
  451. zgBuildProjects.TextAligns.Cols[1] := gaCenterLeft;
  452. zgBuildProjects.TextAligns.Cols[2] := gaCenterLeft;
  453. zgBuildProjects.TextAligns.Cols[3] := gaCenterCenter;
  454. zgBuildProjects.TextAligns.Cols[4] := gaCenterLeft;
  455. zgBuildProjects.TextAligns.Cols[5] := gaCenterLeft;
  456. zgBuildProjects.TextAligns.Alignment[1, 0] := gaCenterCenter;
  457. zgBuildProjects.TextAligns.Alignment[2, 0] := gaCenterCenter;
  458. zgBuildProjects.TextAligns.Alignment[3, 0] := gaCenterCenter;
  459. zgBuildProjects.TextAligns.Alignment[4, 0] := gaCenterCenter;
  460. zgBuildProjects.TextAligns.Alignment[5, 0] := gaCenterCenter;}
  461. zgBuildProjects.CellClass.Cols[3] := TZjComboCell;
  462. ztRelaFiles.Clear;
  463. zgRelaFiles.RowCount := 1;
  464. //zgRelaFiles.ColWidths[0] := 22;
  465. zgRelaFiles.ColWidths[1] := 22;
  466. zgRelaFiles.ColWidths[2] := 298;
  467. //zgRelaFiles.ColWidths[3] := 200;
  468. zgRelaFiles.Cells[2, 0].Text := '名称';
  469. zgRelaFiles.TextAligns.Cols[0] := gaCenterCenter;
  470. zgRelaFiles.TextAligns.Cols[1] := gaCenterCenter;
  471. zgRelaFiles.TextAligns.Cols[2] := gaCenterLeft;
  472. zgRelaFiles.TextAligns.Alignment[2, 0] := gaCenterCenter;
  473. Node := ztRelaFiles.AddChild(nil);
  474. // zgRelaFiles.Cells[0, Node.MajorIndex + zgRelaFiles.FixedRowCount].Width := 2;
  475. { Node.Caption[1] := '项目文件';
  476. Node.Expand;
  477. FProjectParent := Node;
  478. Node := ztRelaFiles.Add(Node);}
  479. // zgRelaFiles.Cells[0, Node.MajorIndex + zgRelaFiles.FixedRowCount].Width := 2;
  480. {$IFNDEF _ScNoFeeRate}
  481. Node.Caption[1] := '费率文件';
  482. Node.Expand;
  483. FFeeParent := Node;
  484. Node := ztRelaFiles.Add(Node);
  485. {$ENDIF}
  486. // zgRelaFiles.Cells[0, Node.MajorIndex + zgRelaFiles.FixedRowCount].Width := 2;
  487. Node.Caption[1] := '单价文件';
  488. Node.Expand;
  489. FPriceParent := Node;
  490. Node := ztRelaFiles.Add(Node);
  491. // zgRelaFiles.Cells[0, Node.MajorIndex + zgRelaFiles.FixedRowCount].Width := 2;
  492. Node.Caption[1] := '定额库';
  493. Node.Expand;
  494. FRationParent := Node;
  495. zgRelaFiles.Selection.Current := Point(2, 1);
  496. zgRelaFiles.TopLeftCoord := Point(1, 1);
  497. zgProperties.ColWidths[0] := 120;
  498. zgProperties.ColWidths[1] := 180;
  499. zgProperties.Cells[0, 0].Text := '属性';
  500. zgProperties.Cells[1, 0].Text := '值';
  501. zgProperties.TextAligns.Cols[0] := gaCenterLeft;
  502. zgProperties.TextAligns.Cols[1] := gaCenterRight;
  503. zgProperties.TextAligns.Alignment[0, 0] := gaCenterCenter;
  504. zgProperties.TextAligns.Alignment[1, 0] := gaCenterCenter;
  505. zgBPBasic.ColWidths[1] := 150;
  506. zgBPBasic.ColWidths[2] := 180;
  507. zgBPBasic.Cells[1, 0].Text := '属性';
  508. zgBPBasic.Cells[2, 0].Text := '值';
  509. zgBPBasic.TextAligns.Cols[1] := gaCenterLeft;
  510. zgBPBasic.TextAligns.Cols[2] := gaCenterRight;
  511. zgBPBasic.TextAligns.Alignment[1, 0] := gaCenterCenter;
  512. zgBPBasic.TextAligns.Alignment[2, 0] := gaCenterCenter;
  513. zgBPZhaoBiao.ColWidths[1] := 150;
  514. zgBPZhaoBiao.ColWidths[2] := 180;
  515. zgBPZhaoBiao.Cells[1, 0].Text := '属性';
  516. zgBPZhaoBiao.Cells[2, 0].Text := '值';
  517. zgBPZhaoBiao.TextAligns.Cols[1] := gaCenterLeft;
  518. zgBPZhaoBiao.TextAligns.Cols[2] := gaCenterRight;
  519. zgBPZhaoBiao.TextAligns.Alignment[1, 0] := gaCenterCenter;
  520. zgBPZhaoBiao.TextAligns.Alignment[2, 0] := gaCenterCenter;
  521. zgBPTouBiao.ColWidths[1] := 150;
  522. zgBPTouBiao.ColWidths[2] := 180;
  523. zgBPTouBiao.Cells[1, 0].Text := '属性';
  524. zgBPTouBiao.Cells[2, 0].Text := '值';
  525. zgBPTouBiao.TextAligns.Cols[1] := gaCenterLeft;
  526. zgBPTouBiao.TextAligns.Cols[2] := gaCenterRight;
  527. zgBPTouBiao.TextAligns.Alignment[1, 0] := gaCenterCenter;
  528. zgBPTouBiao.TextAligns.Alignment[2, 0] := gaCenterCenter;
  529. cbbGatherOtherFee.Clear;
  530. cbbGatherOtherFee.Items.Add('以汇总后定额建安费为基数');
  531. cbbGatherOtherFee.Items.Add('各汇总工程相加');
  532. cbbSiteConstructType.Clear;
  533. cbbSiteConstructType.Items.Add('以汇总后定额建安费(不含专项费用)为基数');
  534. cbbSiteConstructType.Items.Add('各汇总工程相加');
  535. CommonFeeLib.GetProgressiveFeeList(cbbProgressiveFile.Items);
  536. end;
  537. procedure TScfrmBigProjManage.RefreshPropertyView;
  538. var
  539. vNode, vParent: TScProjManagerTreeNode;
  540. iID, I: Integer;
  541. PropRec: TsdDataRecord;
  542. begin
  543. if not ProjectManager.Active then Exit;
  544. if staBuildProjects.DataView = nil then Exit;
  545. // 建设项目总造价
  546. vNode := TScProjManagerTreeNode(ProjectManager.ManagerTree.Selected);
  547. if Assigned(vNode) then
  548. vParent := TScProjManagerTreeNode(vNode.Parent)
  549. else
  550. vParent := nil;
  551. zgProperties.RowCount := Length(PropertyNames) + zgProperties.FixedRowCount;
  552. if not Assigned(vNode) or not vNode.IsTender then
  553. begin
  554. zgProperties.Clear;
  555. Exit;
  556. end;
  557. iID := vNode.ID;
  558. PropRec := ProjectManager.PropertiesRec(iID);
  559. if PropRec = nil then
  560. begin
  561. zgProperties.Clear;
  562. Exit;
  563. end;
  564. FIsPropLoading := True;
  565. zgProperties.RowCount := Length(PropertyNames) + zgProperties.FixedRowCount;// + 1;
  566. // 当要改变属性位置、或者在中间插入新属性时,以下代码维护非常困难,这里换一种实现方法。CSL,2019-06-03
  567. // for I := 0 to Length(PropertyNames) - 1 do
  568. // begin
  569. // if I < 2 then
  570. // zgProperties.Cells[0, I + zgProperties.FixedRowCount].Text := ProjectPropertiesArray[I]
  571. // else if I = 2 then
  572. // zgProperties.Cells[0, I + zgProperties.FixedRowCount].Text := ProjectPropertiesArray[23]
  573. // else if I < 5 then
  574. // zgProperties.Cells[0, I + zgProperties.FixedRowCount].Text := ProjectPropertiesArray[I-1]
  575. // else if I > 5 then
  576. // zgProperties.Cells[0, I + zgProperties.FixedRowCount + 1].Text := ProjectPropertiesArray[I-1]
  577. // else
  578. // begin
  579. // // 单位工程名称/合同段
  580. // if _IsGuangDong then
  581. // zgProperties.Cells[0, I + zgProperties.FixedRowCount].Text := '合同段'
  582. // else if PropRec.ValueByName(SValue + IntToStr(1)).AsString = '招投标' then
  583. // zgProperties.Cells[0, I + zgProperties.FixedRowCount].Text := '合同段'
  584. // else
  585. // zgProperties.Cells[0, I + zgProperties.FixedRowCount].Text := '单位工程名称';
  586. // // 编制范围
  587. // zgProperties.Cells[0, I + zgProperties.FixedRowCount + 1].Text := ProjectPropertiesArray[I-1];
  588. // end;
  589. // {$IFDEF _ScNoFeeRate}
  590. // if (I >= 2) and (I < 18) then
  591. // zgProperties.Cells[1, I + zgProperties.FixedRowCount].Text :=
  592. // PropRec.ValueByName(SValue + IntToStr(I + 2)).AsString
  593. // else
  594. // {$ENDIF}
  595. // if I < 2 then
  596. // zgProperties.Cells[1, I + zgProperties.FixedRowCount].Text :=
  597. // PropRec.ValueByName(SValue + IntToStr(I + 1)).AsString
  598. // else if I = 2 then
  599. // zgProperties.Cells[1, I + zgProperties.FixedRowCount].Text :=
  600. // PropRec.ValueByName(SValue + IntToStr(25)).AsString
  601. // else if I < 5 then
  602. // zgProperties.Cells[1, I + zgProperties.FixedRowCount].Text :=
  603. // PropRec.ValueByName(SValue + IntToStr(I)).AsString
  604. // else if I = 5 then
  605. // begin
  606. // // 单位工程名称/合同段 -- Value26
  607. // zgProperties.Cells[1, I + zgProperties.FixedRowCount].Text :=
  608. // PropRec.ValueByName(SValue + IntToStr(26)).AsString;
  609. // // 编制范围
  610. // zgProperties.Cells[1, I + zgProperties.FixedRowCount + 1].Text :=
  611. // PropRec.ValueByName(SValue + IntToStr(I)).AsString;
  612. // end
  613. // else if I > 5 then
  614. // zgProperties.Cells[1, I + zgProperties.FixedRowCount + 1].Text :=
  615. // PropRec.ValueByName(SValue + IntToStr(I)).AsString;
  616. // end;
  617. for I := Low(PropertyNames) to High(PropertyNames) do
  618. begin
  619. zgProperties.Cells[0, I + zgProperties.FixedRowCount - 1].Text := PropertyNames[I];
  620. zgProperties.Cells[1, I + zgProperties.FixedRowCount - 1].Text := PropRec.ValueByName(PropertyFields[I]).AsString;
  621. end;
  622. FIsPropLoading := False;
  623. {$IFDEF _ScNoFeeRate}
  624. // 单价文件
  625. zgProperties.CellClass.Item[1, 4] := TZjEllipsisBtnCell;
  626. // 编制日期
  627. zgProperties.CellClass.Item[1, 8] := TZjComboCell;
  628. // 公路等级
  629. zgProperties.CellClass.Item[1, 15] := TZjComboCell;
  630. {$ELSE}
  631. // 费率文件
  632. zgProperties.CellClass.Item[1, 4] := TZjEllipsisBtnCell;
  633. // 单价文件
  634. zgProperties.CellClass.Item[1, 5] := TZjEllipsisBtnCell;
  635. // 编制日期
  636. zgProperties.CellClass.Item[1, 10] := TZjComboCell;
  637. // 公路等级
  638. zgProperties.CellClass.Item[1, 17] := TZjComboCell;
  639. zgProperties.CellClass.Item[1, 22] := TZjComboCell;
  640. // 税率
  641. zgProperties.CellClass.Item[1, 23] := TZjComboCell;
  642. {$ENDIF}
  643. end;
  644. procedure TScfrmBigProjManage.SetActive(const Value: Boolean);
  645. begin
  646. FActive := Value;
  647. end;
  648. procedure TScfrmBigProjManage.actnOpenUpdate(Sender: TObject);
  649. var
  650. vNode: TScProjManagerTreeNode;
  651. begin
  652. {$IFDEF _ScExportOnly}
  653. TAction(Sender).Enabled := False;
  654. Exit;
  655. {$ENDIF}
  656. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  657. TAction(Sender).Enabled := TScMainForm(Application.MainForm).IsManageView
  658. and Assigned(vNode) and vNode.IsTender;
  659. end;
  660. procedure TScfrmBigProjManage.actnNewBPExecute(Sender: TObject);
  661. var
  662. strName: string;
  663. ProjItem: TScProjManagerTreeNode;
  664. begin
  665. if ScInputQuery('新建建设项目', '请输入建设项目名称', strName, False, True) then
  666. begin
  667. strName := Trim(strName);
  668. if strName = '' then
  669. begin
  670. MessageHint('必须输入建设项目名称。');
  671. Exit;
  672. end;
  673. ProjItem := FManageProjects.FindBuildProjectWithSelect(strName);
  674. if Assigned(ProjItem) then
  675. MessageWarning(Format('存在同名建设项目或者文件夹[%s]。', [strName]))
  676. else
  677. ProjItem := FManageProjects.AddBuildProjectWithSelect(strName, False);
  678. staBuildProjects.DataView.LocateInControl(ProjItem.Rec);
  679. end;
  680. end;
  681. procedure TScfrmBigProjManage.actnImportBPUpdate(Sender: TObject);
  682. var
  683. vNode: TScProjManagerTreeNode;
  684. begin
  685. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  686. TAction(Sender).Enabled := TScMainForm(Application.MainForm).IsManageView and
  687. Assigned(vNode) and not vNode.IsTender;
  688. end;
  689. procedure TScfrmBigProjManage.actnDelBPExecute(Sender: TObject);
  690. var
  691. vProj: TScProjManagerTreeNode;
  692. begin
  693. if staBuildProjects.IDTree.Count > 0 then
  694. begin
  695. vProj := FManageProjects.ManagerTree.Selected;
  696. if vProj.IsTender then
  697. begin
  698. if ProjList.IndexByName(vProj.Rec.FileName.AsString) <> nil then
  699. begin
  700. MessageHint(0, '文件已打开,不能被删除。');
  701. Exit;
  702. end;
  703. end
  704. else if FManageProjects.HasTendersOpened(vProj) then
  705. begin
  706. if vProj.IsBuildProj then
  707. MessageHint(0, Format('建设项目[%s]下的标段已打开,请关闭后再删除建设项目。', [vProj.Rec.Name.AsString]))
  708. else
  709. MessageHint(0, Format('文件夹[%s]下的标段已打开,请关闭后再删除。', [vProj.Rec.Name.AsString]));
  710. Exit;
  711. end;
  712. if vProj.IsBuildProj then
  713. begin
  714. if MessageQuest(0, Format('确定要删除建设项目[%s]吗?', [vProj.Rec.Name.AsString])) = ID_OK then
  715. begin
  716. Screen.Cursor := crHourGlass;
  717. try
  718. FManageProjects.DeleteNode(vProj);
  719. finally
  720. Screen.Cursor := crDefault;
  721. end;
  722. end;
  723. end
  724. else if vProj.IsFolder then
  725. begin
  726. if MessageQuest(0, Format('确定删除文件夹[%s]吗?', [vProj.Rec.Name.AsString])) = ID_OK then
  727. begin
  728. Screen.Cursor := crHourGlass;
  729. try
  730. FManageProjects.DeleteNode(vProj);
  731. finally
  732. Screen.Cursor := crDefault;
  733. end;
  734. end;
  735. end
  736. else if vProj.IsTender then
  737. begin
  738. if MessageQuest(0, Format('确定要删除文件[%s]吗?', [vProj.Rec.Name.AsString])) = ID_OK then
  739. begin
  740. Screen.Cursor := crHourGlass;
  741. try
  742. FManageProjects.DeleteNode(vProj);
  743. finally
  744. Screen.Cursor := crDefault;
  745. end;
  746. end;
  747. end;
  748. end;
  749. end;
  750. procedure TScfrmBigProjManage.actnBPCopyToExecute(Sender: TObject);
  751. var
  752. vNode: TScProjManagerTreeNode;
  753. iProjID: Integer;
  754. Tenders: TList;
  755. slstFiles: TStringList;
  756. strPath, strFile, strNewFile: string;
  757. I: Integer;
  758. begin
  759. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  760. if Assigned(vNode) and (vNode.Rec.ValueByName('Type').AsInteger = 0) then
  761. begin
  762. iProjID := vNode.ID;
  763. if BrowseFolder(strPath) then
  764. begin
  765. if strPath[Length(strPath)] <> '\' then
  766. strPath := strPath + '\';
  767. Tenders := TList.Create;
  768. slstFiles := TStringList.Create;
  769. try
  770. FManageProjects.LoadBuildProjectTenders(iProjID, Tenders);
  771. for I := 0 to Tenders.Count - 1 do
  772. begin
  773. strFile := TsdDataRecord(Tenders.Items[I]).ValueByName('FileName').AsString;
  774. strNewFile := strPath + ExtractFileName(strFile);
  775. if FileExists(strNewFile) then
  776. begin
  777. if MessageQuest(0, Format('目标文件夹已有文件[]存在,是否覆盖此文件?',
  778. [ExtractFileName(strFile)])) = ID_OK then
  779. CopyFile(PChar(strFile), PChar(strNewFile), False);
  780. end
  781. else
  782. CopyFile(PChar(strFile), PChar(strNewFile), False);
  783. end;
  784. if FManageProjects.GetRelaFileList(iProjID, slstFiles, True) > 0 then
  785. for I := 0 to slstFiles.Count - 1 do
  786. begin
  787. strFile := slstFiles[I];
  788. strNewFile := strPath + ExtractFileName(strFile);
  789. if FileExists(strNewFile) then
  790. begin
  791. if MessageQuest(0, Format('目标文件夹已有文件[]存在,是否覆盖此文件?',
  792. [ExtractFileName(strFile)])) = ID_OK then
  793. CopyFile(PChar(strFile), PChar(strNewFile), False);
  794. end
  795. else
  796. CopyFile(PChar(strFile), PChar(strNewFile), False);
  797. end;
  798. finally
  799. Tenders.Free;
  800. slstFiles.Free;
  801. end;
  802. end;
  803. end;
  804. end;
  805. procedure TScfrmBigProjManage.actnEditBPNameExecute(Sender: TObject);
  806. var
  807. vTender: TScProjManagerTreeNode;
  808. begin
  809. if zgBuildProjects.Editing then Exit;
  810. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  811. if not Assigned(vTender) then Exit;
  812. if IsFileHadExportedStaticBills(vTender.Rec.FileName.AsString) then
  813. begin
  814. if not MessageYesOrNo('修改标段名称,先前导出的固化清单将作废!' + #13#10 + '您是否要继续?') then
  815. Exit;
  816. end;
  817. //staBuildProjects.Column('Name').ReadOnly := False;
  818. if zgBuildProjects.CurCol <> 1 then
  819. zgBuildProjects.CurCol := 1;
  820. zgBuildProjects.ForceEdit; //Editing := True;
  821. end;
  822. procedure TScfrmBigProjManage.actnNewExecute(Sender: TObject);
  823. var
  824. vNode: TScProjManagerTreeNode;
  825. begin
  826. if staBuildProjects.IDTree.Count = 0 then
  827. begin
  828. MessageHint('请先新建一个文件夹。');
  829. actnNewFolder.Execute;
  830. Exit;
  831. end;
  832. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  833. if vNode.IsBuildProj then
  834. begin
  835. // {$IF DEFINED(_ScOnline) AND NOT DEFINED(_ScOnlinePro)}
  836. // if ProjectManager.BuildProjectCount > MaxBuildProjectCountOnline then
  837. // begin
  838. // MessageHint(Format('您创建的建设项目已超%d个,请联系我们客服人员,服务热线:0756-3850888。', [MaxBuildProjectCountOnline]));
  839. // Exit;
  840. // end;
  841. // {$IFEND}
  842. TScMainForm(Application.MainForm).OpenFile('', staBuildProjects.IDTree.Selected.ID, oftNew);
  843. end
  844. else if vNode.IsTender then
  845. TScMainForm(Application.MainForm).OpenFile('', staBuildProjects.IDTree.Selected.ParentID, oftNew)
  846. else
  847. TScMainForm(Application.MainForm).OpenFile('', -1, oftNew);
  848. RefreshInfoView;
  849. end;
  850. procedure TScfrmBigProjManage.actnInsertExecute(Sender: TObject);
  851. var
  852. I: Integer;
  853. tmpFiles: TStringList;
  854. begin
  855. odOpenFiles.InitialDir := ConfigInfo.DefaultProjectFilePath;
  856. odOpenFiles.Filter := GetDialogExtString(dtAll);
  857. if odOpenFiles.Execute then
  858. begin
  859. tmpFiles := TStringList.Create;
  860. try
  861. for I := 0 to odOpenFiles.Files.Count - 1 do
  862. begin
  863. if SameText(ExtractFileExt(odOpenFiles.Files[I]), SBillsFileExt)
  864. or SameText(ExtractFileExt(odOpenFiles.Files[I]), SBudgetFileExt) then
  865. tmpFiles.Add(odOpenFiles.Files[I]);
  866. end;
  867. FManageProjects.AddExistProjects(tmpFiles, CurBuildProjID);
  868. finally
  869. tmpFiles.Free;
  870. end;
  871. RefreshInfoView;
  872. end;
  873. end;
  874. procedure TScfrmBigProjManage.actnOpenExecute(Sender: TObject);
  875. var
  876. vTender: TScProjManagerTreeNode;
  877. strFile: string;
  878. begin
  879. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  880. if Assigned(vTender) and vTender.IsTender then
  881. begin
  882. strFile := ScExpandFileName(vTender.Rec.FileName.AsString);
  883. TScMainForm(Application.MainForm).OpenFile(strFile);
  884. end;
  885. end;
  886. procedure TScfrmBigProjManage.zgRelaFilesCellCanEdit(Sender: TObject;
  887. const ACoord: TPoint; var Allow: Boolean);
  888. var
  889. Node: TZjTreeNode;
  890. begin
  891. if ACoord.X <> 2 then
  892. begin
  893. Allow := False;;
  894. Exit;
  895. end;
  896. Node := ztRelaFiles.Items[zgRelaFiles.CurRow - zgRelaFiles.FixedRowCount];
  897. if (Node = nil) then
  898. begin
  899. Allow := False;;
  900. Exit;
  901. end;
  902. if Node.Parent = nil then
  903. begin
  904. Allow := False;
  905. Exit;
  906. end;
  907. Allow := (Node.Parent = FFeeParent) or (Node.Parent = FPriceParent);
  908. end;
  909. procedure TScfrmBigProjManage.zgRelaFilesCellGetColor(Sender: TObject;
  910. ACoord: TPoint; var AColor: TColor);
  911. begin
  912. if (ACoord.X = 1) or ((ACoord.Y <= ztRelaFiles.Count) and
  913. (ztRelaFiles.Items[ACoord.Y - zgRelaFiles.FixedRowCount].Level = 0)) then
  914. AColor := clBtnFace;
  915. end;
  916. procedure TScfrmBigProjManage.zgPropertiesCellCanEdit(Sender: TObject;
  917. const ACoord: TPoint; var Allow: Boolean);
  918. var
  919. vNode: TScProjManagerTreeNode;
  920. begin
  921. // 固化清单 注意 这句一定要在最前面
  922. // 5-16 项目属性暂时不变灰
  923. // Allow := IsPropertyCanEdit(ACoord);
  924. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  925. if (ACoord.X = 0) or (not Assigned(vNode)) or (not vNode.IsTender) or
  926. (ProjectManager.PropertiesRec(vNode.ID) = nil)
  927. or (ACoord.Y in [1, 2, 3, 4, 5]) then
  928. Allow := False;
  929. end;
  930. procedure TScfrmBigProjManage.zgPropertiesCellGetColor(Sender: TObject;
  931. ACoord: TPoint; var AColor: TColor);
  932. begin
  933. if ACoord.X = 0 then
  934. AColor := clBtnFace;
  935. // 固化清单 属性不可以编辑的颜色变灰
  936. // 5-16 颜色不变灰了
  937. //if (ACoord.X = 1) and (not IsPropertyCanEdit(ACoord))then
  938. // AColor := clBtnFace;
  939. end;
  940. procedure TScfrmBigProjManage.actnImportProjectExecute(Sender: TObject);
  941. begin
  942. odImport.Filter := GetDialogExtString(dtProjectAll);
  943. // 专业版exe
  944. {$IF (not Defined(_ScBills)) and (not Defined(_ScBudget)) and (not Defined(_ScGuangDong_Bills)) and (not Defined(_ScGuangDong_Budget))}
  945. if DogIsBillsOnly then
  946. odImport.Filter := GetDialogExtString(dtBillsAndX)
  947. else if DogIsBudgetOnly then
  948. odImport.Filter := GetDialogExtString(dtBudgetAndX);
  949. {$IFEND}
  950. {$IF DEFINED(_ScBudget) OR DEFINED(_ScGuangDong_Budget)}
  951. odImport.Filter := GetDialogExtString(dtBudgetAndX);
  952. {$IFEND}
  953. {$IF DEFINED(_ScBills) OR DEFINED(_ScGuangDong_Bills)}
  954. odImport.Filter := GetDialogExtString(dtBillsAndX);
  955. {$IFEND}
  956. if odImport.Execute then
  957. ImportBudgetProject(odImport.FileName);
  958. end;
  959. procedure TScfrmBigProjManage.actnImportProjectUpdate(Sender: TObject);
  960. var
  961. vNode: TScProjManagerTreeNode;
  962. begin
  963. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  964. TAction(Sender).Enabled := TScMainForm(Application.MainForm).IsManageView and
  965. Assigned(vNode) and not vNode.IsFolder;
  966. end;
  967. procedure TScfrmBigProjManage.actnExportSingleProjectExecute(
  968. Sender: TObject);
  969. begin
  970. ExportCurrentProjectFile(True);
  971. end;
  972. procedure TScfrmBigProjManage.actnCopyProjectExecute(Sender: TObject);
  973. procedure CheckProperties(AOldID, ANewBPID: Integer; ANewName: string);
  974. var
  975. Rec: TsdDataRecord;
  976. iNewID: Integer;
  977. begin
  978. Rec := ProjectManager.TendersRec(ANewBPID, ANewName);
  979. if Rec = nil then Exit;
  980. iNewID := Rec.ValueByName('ID').AsInteger;
  981. ProjectManager.CopyProperties(AOldID, iNewID);
  982. end;
  983. var
  984. iBPID, iProjectID: Integer;
  985. vTender, Node: TScProjManagerTreeNode;
  986. strBPName: string;
  987. strAlias, strFeeAlias, strPriceAlias,
  988. strFile, strFeeFile, strPriceFile,
  989. strNewFile, strNewFeeFile, strNewPriceFile: string;
  990. slstFiles: TStringList;
  991. begin
  992. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  993. if not Assigned(vTender) or not vTender.IsTender then Exit;
  994. if not SelectBuildProject(iBPID) then Exit;
  995. slstFiles := TStringList.Create;
  996. try
  997. // 项目文件
  998. strAlias := vTender.Rec.Name.AsString;
  999. strFile := vTender.Rec.FileName.AsString;
  1000. iProjectID := vTender.ID;
  1001. Node := TScProjManagerTreeNode(ProjectManager.ManagerTree.FindNode(iBPID));
  1002. if Node = nil then Exit;
  1003. strBPName := Node.Rec.ValueByName('Name').AsString;
  1004. if ProjectManager.TendersRec(iBPID, strAlias) <> nil then
  1005. begin
  1006. MessageHint(0, Format('建设项目[%s]中已存在分段[%s],请修改名称后再复制。', [strBPName, strAlias]));
  1007. Exit;
  1008. end;
  1009. strNewFile := ConfigInfo.NewGUIDFileName;
  1010. CopyFile(PChar(strFile), PChar(strNewFile), False);
  1011. slstFiles.Add(strNewFile);
  1012. // 费率文件
  1013. strFeeAlias := ProjectManager.GetProjectRelaAlias(iProjectID, FileType_FeeFile);
  1014. strFeeFile := ProjectManager.GetProjectRelaFileName(iProjectID, FileType_FeeFile);
  1015. // 存在同名文件则不复制
  1016. if FileExists(strFeeFile) and (not ProjectManager.RelaFileExists(iBPID, strFeeAlias, FileType_FeeFile)) then
  1017. begin
  1018. strNewFeeFile := ConfigInfo.NewGUIDFileName;
  1019. CopyFile(PChar(strFeeFile), PChar(strNewFeeFile), False);
  1020. slstFiles.Add(strNewFeeFile);
  1021. end;
  1022. // 单价文件
  1023. strPriceAlias := ProjectManager.GetProjectRelaAlias(iProjectID, FileType_PriceFile);
  1024. strPriceFile := ProjectManager.GetProjectRelaFileName(iProjectID, FileType_PriceFile);
  1025. // 存在同名文件则不复制
  1026. if FileExists(strPriceFile) and (not ProjectManager.RelaFileExists(iBPID, strPriceAlias, FileType_PriceFile)) then
  1027. begin
  1028. strNewPriceFile := ConfigInfo.NewGUIDFileName;
  1029. CopyFile(PChar(strPriceFile), PChar(strNewPriceFile), False);
  1030. slstFiles.Add(strNewPriceFile);
  1031. end;
  1032. ProjectManager.AddExistProjects(slstFiles, iBPID);
  1033. CheckProperties(iProjectID, iBPID, strAlias);
  1034. finally
  1035. slstFiles.Free;
  1036. end;
  1037. end;
  1038. procedure TScfrmBigProjManage.actnNewFeeFileExecute(Sender: TObject);
  1039. var
  1040. strAlias, strFile: string;
  1041. iID: Integer;
  1042. Lib: TScFeeRateLib;
  1043. begin
  1044. if ScInputQuery('新建费率文件', '请输入费率文件名称', strAlias, False, True) then
  1045. begin
  1046. strAlias := Trim(strAlias);
  1047. if strAlias = '' then
  1048. begin
  1049. MessageHint(0, '文件名不能为空。');
  1050. Exit;
  1051. end;
  1052. if ProjectManager.GetRelaFileName(CurBuildProjID, strAlias, FileType_FeeFile) <> '' then
  1053. begin
  1054. MessageHint(0, Format('费率文件[%s]已存在。', [strAlias]));
  1055. Exit;
  1056. end;
  1057. strFile := ConfigInfo.NewGUIDFileName;
  1058. iID := FeeRateLibs.New(strFile, ptBudget);
  1059. Lib := FeeRateLibs.Libs[iID];
  1060. FileArchiverManager.Alias[strFile] := strAlias;
  1061. ProjectManager.AddRelaFile(strFile, CurBuildProjID);
  1062. RefreshInfoView;
  1063. end;
  1064. end;
  1065. procedure TScfrmBigProjManage.actnNewPriceFileExecute(Sender: TObject);
  1066. var
  1067. strAlias, strFile: string;
  1068. iID: Integer;
  1069. Lib: TScUnitPriceLib;
  1070. begin
  1071. if ScInputQuery('新建单价文件', '请输入单价文件名称', strAlias, False, True) then
  1072. begin
  1073. strAlias := Trim(strAlias);
  1074. if strAlias = '' then
  1075. begin
  1076. MessageHint(0, '文件名不能为空。');
  1077. Exit;
  1078. end;
  1079. if ProjectManager.GetRelaFileName(CurBuildProjID, strAlias, FileType_PriceFile) <> '' then
  1080. begin
  1081. MessageHint(0, Format('单价文件[%s]已存在。', [strAlias]));
  1082. Exit;
  1083. end;
  1084. strFile := ConfigInfo.NewGUIDFileName;
  1085. iID := UnitPriceLibs.New(strFile);
  1086. Lib := UnitPriceLibs.Libs[iID];
  1087. FileArchiverManager.Alias[strFile] := strAlias;
  1088. ProjectManager.AddRelaFile(strFile, CurBuildProjID);
  1089. RefreshInfoView;
  1090. end;
  1091. end;
  1092. procedure TScfrmBigProjManage.actnNewFeeFileUpdate(Sender: TObject);
  1093. var
  1094. vNode: TScProjManagerTreeNode;
  1095. begin
  1096. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  1097. TAction(Sender).Enabled := Assigned(vNode) and (vNode.Rec.ValueByName('Type').AsInteger = 0);
  1098. end;
  1099. procedure TScfrmBigProjManage.actnExportRelaFileUpdate(Sender: TObject);
  1100. var
  1101. Node: TZjGridTreeNode;
  1102. bEnabled: Boolean;
  1103. vNode: TScProjManagerTreeNode;
  1104. begin
  1105. bEnabled := False;
  1106. Node := ztRelaFiles.RowItems[zgRelaFiles.CurRow];
  1107. if Node <> nil then
  1108. bEnabled := (Node.Parent = FFeeParent) or (Node.Parent = FPriceParent);
  1109. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  1110. TAction(Sender).Enabled := Assigned(vNode) and (vNode.Rec.ValueByName('Type').AsInteger = 0) and bEnabled;
  1111. end;
  1112. procedure TScfrmBigProjManage.actnExportRelaFileExecute(Sender: TObject);
  1113. begin
  1114. ExportCurrentRelaFile(True);
  1115. end;
  1116. procedure TScfrmBigProjManage.zgBuildProjectsDrawCellText(ACanvas: TCanvas;
  1117. const ARect: TRect; const ACoord: TPoint; AGrid: TZJGrid;
  1118. const Text: String; var ADefaultDraw: Boolean);
  1119. const
  1120. rIconWidth = 18;
  1121. rIconHeight = 16;
  1122. var
  1123. Img: TBitmap;
  1124. Cell: TZjCell;
  1125. rImg: TRect;
  1126. vNode: TScProjManagerTreeNode;
  1127. begin
  1128. if (ACoord.X = staBuildProjects.ColumnIndex('Name') + zgBuildProjects.FixedColCount) and (ACoord.Y > zgBuildProjects.FixedRowCount - 1) then
  1129. begin
  1130. Cell := zgBuildProjects.Cells[ACoord.X, ACoord.Y];
  1131. Img := TBitmap.Create;
  1132. try
  1133. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Items[ACoord.Y-zgBuildProjects.FixedRowCount]);
  1134. if Assigned(vNode) then
  1135. begin
  1136. if vNode.IsFolder then
  1137. ilstProject.GetBitmap(22, Img)
  1138. else if vNode.IsTender then
  1139. ilstProject.GetBitmap(24, Img)
  1140. else if vNode.IsBuildProj then
  1141. ilstProject.GetBitmap(23, Img);
  1142. end;
  1143. case Cell.Align of
  1144. gaTopLeft, gaTopCenter, gaTopRight:
  1145. rImg := Rect(ARect.Left + 2, ARect.Top, ARect.Left + rIconWidth, ARect.Top + rIconHeight);
  1146. gaCenterLeft, gaCenterCenter, gaCenterRight:
  1147. rImg := Rect(ARect.Left + 2, ARect.Top + (ARect.Bottom - ARect.Top - rIconHeight) div 2, ARect.Left + rIconWidth, ARect.Bottom - (ARect.Bottom - ARect.Top - rIconHeight) div 2);
  1148. gaBottomLeft, gaBottomCenter, gaBottomRight:
  1149. rImg := Rect(ARect.Left + 2, ARect.Bottom - rIconHeight, ARect.Left + rIconWidth, ARect.Bottom);
  1150. end;
  1151. ACanvas.StretchDraw(rImg, Img);
  1152. WriteText(ACanvas, Rect(ARect.Left + rIconWidth, ARect.Top, ARect.Right, ARect.Bottom)
  1153. , 2, 2, Text, Cell.Align, goWarpText in zgBuildProjects.Options);
  1154. ADefaultDraw := False;
  1155. finally
  1156. Img.Free;
  1157. end;
  1158. end;
  1159. end;
  1160. procedure TScfrmBigProjManage.BatchExportBuildProject;
  1161. function GetBuildProjectName(const AName: string): string;
  1162. var
  1163. sgs: TStrings;
  1164. begin
  1165. if Pos(sPathSpr, AName) > 0 then
  1166. begin
  1167. sgs := TStringList.Create;
  1168. try
  1169. DelimitedTextTo(sPathSpr, AName, sgs);
  1170. Result := sgs.Strings[sgs.Count - 1];
  1171. finally
  1172. sgs.Free;
  1173. end;
  1174. end
  1175. else
  1176. Result := AName;
  1177. end;
  1178. var
  1179. Form: TExportBuildProjectsForm;
  1180. I, j: Integer;
  1181. strPath, strFile, sBP, strName: string;
  1182. begin
  1183. // 网络版超过20个建设项目则禁止导入导出建设项目
  1184. // {$IF DEFINED(_ScOnline) AND NOT DEFINED(_ScOnlinePro)}
  1185. // if ProjectManager.BuildProjectCount > MaxBuildProjectCountOnline then
  1186. // begin
  1187. // MessageHint(Format('您创建的建设项目已超%d个,请联系我们客服人员,服务热线:0756-3850888。', [MaxBuildProjectCountOnline]));
  1188. // Exit;
  1189. // end;
  1190. // {$IFEND}
  1191. Form := TExportBuildProjectsForm.Create(nil);
  1192. try
  1193. Form.clbBuildProject.Clear;
  1194. FManageProjects.FullBuildProjtsName(Form.clbBuildProject.Items);
  1195. if Form.clbBuildProject.Count = 0 then
  1196. begin
  1197. MessageHint(0, '没有可导出的建设项目。');
  1198. Exit;
  1199. end;
  1200. if Form.ShowModal = mrOK then
  1201. begin
  1202. strPath := ConfigInfo.OutputPath;
  1203. if BrowseFolder(strPath) then
  1204. begin
  1205. Screen.Cursor := crHourGlass;
  1206. try
  1207. if strPath[Length(strPath)] <> '\' then
  1208. strPath := strPath + '\';
  1209. for I := 0 to Form.clbBuildProject.Count - 1 do
  1210. begin
  1211. if Form.clbBuildProject.Checked[I] then
  1212. begin
  1213. sBP := Form.clbBuildProject.Items[I];
  1214. // Chenshilong, 2010-8-3 22:21:33 成批导出PB前先保存。用BuildProjectName识别
  1215. for j := 0 to ProjList.Count - 1 do
  1216. begin
  1217. if SameText(ProjList.ProjData[j].BuildProjectName, sBP) then
  1218. ProjList.ProjData[j].Save;
  1219. end;
  1220. strName := GetBuildProjectName(Form.clbBuildProject.Items[I]) + SBuildProjectFileExt;
  1221. strFile := strPath + strName;
  1222. if not FileExists(strFile) or MessageQuest(Format('%s 已存在' + #13#10 + '要替换它吗?', [strName])) then
  1223. ExportBuildProject(Integer(Form.clbBuildProject.Items.Objects[I]), Form.clbBuildProject.Items[I], strFile);
  1224. end;
  1225. end;
  1226. finally
  1227. Screen.Cursor := crDefault;
  1228. end;
  1229. end;
  1230. end;
  1231. finally
  1232. Form.Free;
  1233. end;
  1234. end;
  1235. procedure TScfrmBigProjManage.ExportBuildProject(
  1236. ABuildProjectID: Integer; ABuildProjectName, AFileName: string);
  1237. var
  1238. Exporter: TScBuildProjectSaver;
  1239. Tenders: TList;
  1240. i: Integer;
  1241. Rec: TsdDataRecord;
  1242. strFeeTaxFile: string;
  1243. iProjectCount: Integer;
  1244. arrSelection: array [0..255] of Boolean;
  1245. procedure ExportProperties;
  1246. var
  1247. vNode: TScProjManagerTreeNode;
  1248. begin
  1249. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.FindNode(ABuildProjectID));
  1250. Exporter.Author := vNode.Rec.Author.AsString;
  1251. Exporter.Auditor := vNode.Rec.Auditor.AsString;
  1252. Exporter.Principal := vNode.Rec.Principal.AsString;
  1253. Exporter.ProgressiveType := Ord(FManageProjects.GetProgressiveType(ABuildProjectID));
  1254. Exporter.ProgressiveFile := FManageProjects.GetProgressiveFileName(ABuildProjectID);
  1255. Exporter.ProgressiveCoe := FManageProjects.GetProgressiveCoe(ABuildProjectID);
  1256. Exporter.SiteConstructType := Ord(FManageProjects.GetSiteConstructType(ABuildProjectID));
  1257. Exporter.SetSelectedProjects(iProjectCount, arrSelection);
  1258. ExportBPProperties(ABuildProjectID, Exporter.Properties);
  1259. end;
  1260. begin
  1261. ZeroMemory(@arrSelection[0], SizeOf(arrSelection));
  1262. Exporter := TScBuildProjectSaver.Create;
  1263. Tenders := TList.Create;
  1264. try
  1265. FManageProjects.LoadBuildProjectTenders(ABuildProjectID, Tenders);
  1266. iProjectCount := Tenders.Count;
  1267. for i := 0 to Tenders.Count - 1 do
  1268. begin
  1269. Rec := TsdDataRecord(Tenders.Items[i]);
  1270. Exporter.AddExportFile(Rec.ValueByName('FileName').AsString);
  1271. arrSelection[I] := Rec.ValueByName(SSelected).AsBoolean;
  1272. strFeeTaxFile := FindFeeTaxFile(Rec.ValueByName('ID').AsInteger);
  1273. if FileExists(strFeeTaxFile) then
  1274. Exporter.AddExportFile(strFeeTaxFile, FileType_FeeTaxFile);
  1275. end;
  1276. with FManageProjects do
  1277. begin
  1278. cdsRelaFiles.Filtered := False;
  1279. cdsRelaFiles.Filter := 'BuildProjectID=' + IntToStr(ABuildProjectID);
  1280. cdsRelaFiles.Filtered := True;
  1281. cdsRelaFiles.First;
  1282. while not cdsRelaFiles.Eof do
  1283. begin
  1284. Exporter.AddExportFile(cdsRelaFilesFileName.Value);
  1285. cdsRelaFiles.Next;
  1286. end;
  1287. cdsRelaFiles.Filtered := False;
  1288. end;
  1289. // 导出我的工料机
  1290. Exporter.AddExportFile(DefaultGLJLibFile);
  1291. //Exporter.AddExportFile(DefaultMachineCalcDataFile);
  1292. ExportProperties;
  1293. Exporter.ExportProject(ABuildProjectID, ABuildProjectName, AFileName);
  1294. finally
  1295. Exporter.Free;
  1296. Tenders.Free;
  1297. end;
  1298. end;
  1299. procedure TScfrmBigProjManage.actnImportRelaFileExecute(Sender: TObject);
  1300. var
  1301. strAlias, strFile, strNewFile, strVer: string;
  1302. bQuery: Boolean;
  1303. iFileType: Integer;
  1304. begin
  1305. odImport.Filter := GetDialogExtString({$IFDEF _ScNoFeeRate}dtPrice{$ELSE}dtFeeAndPrice{$ENDIF});
  1306. if odImport.Execute then
  1307. begin
  1308. strFile := odImport.FileName;
  1309. // 检查是否不能兼容的旧文件
  1310. if IsTooOldFile(strFile, strVer) then
  1311. begin
  1312. MessageWarning(Format('此文件由版本号为[%s]的SmartCost程序创建,本版本不再兼容,请使用原版本程序打开该文件。', [strVer]));
  1313. Exit;
  1314. end;
  1315. strAlias := FileArchiverManager.Alias[strFile];
  1316. // 检查文件类型
  1317. iFileType := -1;
  1318. if IsSmartCostFeeRateFile(strFile) then
  1319. iFileType := FileType_FeeFile
  1320. else if IsSmartCostUnitPriceFile(strFile) then
  1321. iFileType := FileType_PriceFile;
  1322. if iFileType = -1 then Exit;
  1323. // 检查文件是否已存在
  1324. bQuery := False;
  1325. while ProjectManager.RelaFileExists(CurBuildProjID, strAlias, iFileType) do
  1326. begin
  1327. bQuery := ScInputQuery('重命名', '存在同名文件。'#13#10'如确实需要导入该文件,请重命名。', strAlias, False, True);
  1328. if not bQuery then Exit;
  1329. end;
  1330. strNewFile := ConfigInfo.NewGUIDFileName;
  1331. if not CopyFile(PChar(strFile), PChar(strNewFile), True) then
  1332. begin
  1333. MessageWarning('Can not copy file');
  1334. Exit;
  1335. end;
  1336. if bQuery then
  1337. FileArchiverManager.Alias[strNewFile] := strAlias
  1338. else
  1339. CheckAlias(strNewFile, strAlias);
  1340. // 导入
  1341. ProjectManager.AddRelaFile(strNewFile, CurBuildProjID, False);
  1342. RefreshInfoView;
  1343. end;
  1344. end;
  1345. procedure TScfrmBigProjManage.zgPropertiesCellTextChanged(Sender: TObject;
  1346. Col, Row: Integer);
  1347. var
  1348. I: Integer;
  1349. strText, strFileName: string;
  1350. V: TsdValue;
  1351. Proj: TScProjBaseData;
  1352. AName: string;
  1353. iRoadLong: Double;
  1354. vTender: TScProjManagerTreeNode;
  1355. PropRec: TsdDataRecord;
  1356. begin
  1357. if FIsPropLoading then
  1358. Exit;
  1359. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  1360. if not Assigned(vTender) then
  1361. Exit;
  1362. PropRec := ProjectManager.PropertiesRec(vTender.ID);
  1363. if (Col = 1) and (Row > 0) and vTender.IsTender and
  1364. Assigned(PropRec) then
  1365. begin
  1366. strFileName := vTender.Rec.FileName.AsString;
  1367. strText := zgProperties.Cells[Col, Row].Text;
  1368. I := Row - zgProperties.FixedRowCount;
  1369. {$IFDEF _ScNoFeeRate}
  1370. if (I >= 2) and (I < 18) then
  1371. strValue := PropRec.ValueByName(SValue + IntToStr(I + 2)).AsString
  1372. {else if I >= 18 then
  1373. Field := PropRec.ValueByName(SValue + IntToStr(I + 4)) }
  1374. else
  1375. {$ENDIF}
  1376. if I < 2 then
  1377. V := PropRec.ValueByName(SValue + IntToStr(I + 1))
  1378. else if I = 2 then
  1379. V := PropRec.ValueByName(SValue + IntToStr(25))
  1380. else if I < 5 then
  1381. V := PropRec.ValueByName(SValue + IntToStr(I))
  1382. else if I = 5 then
  1383. V := PropRec.ValueByName(SValue + IntToStr(26))
  1384. else if I > 5 then
  1385. V := PropRec.ValueByName(SValue + IntToStr(I - 1));
  1386. {if I = 2 then
  1387. begin
  1388. // 调价金额
  1389. Field := ProjectManager.atProjectProperties.FieldByName(SValue + IntToStr(25));
  1390. end
  1391. else
  1392. begin
  1393. if I < 2 then
  1394. Field := ProjectManager.atProjectProperties.FieldByName(SValue + IntToStr(I + 1))
  1395. else
  1396. Field := ProjectManager.atProjectProperties.FieldByName(SValue + IntToStr(I));
  1397. end;}
  1398. //Field := ProjectManager.atProjectProperties.FieldByName(SValue + IntToStr(I + 1));
  1399. if not SameText(strText, V.AsString) then
  1400. begin
  1401. PropRec.ValueByName('Changed').AsBoolean := True;
  1402. V.AsString := strText;
  1403. Proj := ProjList.IndexByName(strFileName);
  1404. Screen.Cursor := crHourGlass;
  1405. try
  1406. if (Proj <> nil) and Proj.IsOpened then
  1407. begin
  1408. //Proj.Project.CheckPropertie(I, strText, False);
  1409. if I < 2 then
  1410. Proj.Project.CheckPropertie(I + 1, strText, False)
  1411. else if I = 2 then
  1412. Proj.Project.CheckPropertie(25, strText, False)
  1413. else if I < 5 then
  1414. Proj.Project.CheckPropertie(I, strText, False)
  1415. else if I = 5 then
  1416. Proj.Project.CheckPropertie(26, strText, False)
  1417. else if I > 5 then
  1418. Proj.Project.CheckPropertie(I-1, strText, False);
  1419. {if I = 2 then
  1420. begin
  1421. Proj.Project.CheckPropertie(24, strText, False);
  1422. end
  1423. else
  1424. begin
  1425. if I < 2 then
  1426. Proj.Project.CheckPropertie(I, strText, False)
  1427. else
  1428. Proj.Project.CheckPropertie(I-1, strText, False);
  1429. end;}
  1430. Proj.Project.RefreshProjInfo(False);
  1431. end;
  1432. finally
  1433. Screen.Cursor := crDefault;
  1434. end;
  1435. end;
  1436. end;
  1437. end;
  1438. procedure TScfrmBigProjManage.zgPropertiesCellButtonClick(Sender: TObject;
  1439. Col, Row: Integer);
  1440. procedure OpenNewRelaFile(ATender: TScProjManagerTreeNode; AAlias, AFileName: string; AFileType: Integer);
  1441. var
  1442. ProjData: TScProjBaseData;
  1443. strProjFile: string;
  1444. begin
  1445. strProjFile := ATender.Rec.FileName.AsString;
  1446. ProjData := ProjList.IndexByName(strProjFile);
  1447. if (ProjData <> nil) and ProjData.IsOpened and (ProjData.Project <> nil)
  1448. and (ProjData.Project.IsOpened) then
  1449. begin
  1450. if (AFileType = FileType_PriceFile) and
  1451. not ProjData.Project.ProjectUnitPriceLib.IsFile(AAlias, AFileName) then
  1452. ProjData.Project.ProjectUnitPriceLib.Open(AFileName)
  1453. else if (AFileType = FileType_FeeFile) and
  1454. not ProjData.Project.ProjectFeeRateLib.IsFile(AAlias, AFileName) then
  1455. ProjData.Project.ProjectFeeRateLib.Open(AFileName);
  1456. ProjData.RefreshRelaFilesView;
  1457. end;
  1458. end;
  1459. var
  1460. vTender, vBuildProj: TScProjManagerTreeNode;
  1461. strBPName, strText, strFile: string;
  1462. begin
  1463. strText := zgProperties.Cells[1, Row].Text;
  1464. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  1465. if Assigned(vTender) and vTender.IsTender then
  1466. vBuildProj := TScProjManagerTreeNode(vTender.Parent)
  1467. else
  1468. vBuildProj := nil;
  1469. if not Assigned(vBuildProj) then Exit;
  1470. strBPName := ProjectManager.CompleteBuildProjName(vBuildProj.ID);
  1471. strFile := strText;
  1472. case Row of
  1473. {$IFNDEF _ScNoFeeRate}
  1474. 4:
  1475. if BrowseRelaFile(strBPName, FileType_FeeFile, strFile) then
  1476. begin
  1477. strText := FileArchiverManager.Alias[strFile];
  1478. zgProperties.Cells[1, Row].Text := strText;
  1479. zgBuildProjects.InvalidateRow(zgBuildProjects.CurRow);
  1480. OpenNewRelaFile(vTender, strText, strFile, FileType_FeeFile);
  1481. end;
  1482. {$ENDIF}
  1483. {$IFDEF _ScNoFeeRate}4{$ELSE}5{$ENDIF}:
  1484. if BrowseRelaFile(strBPName, FileType_PriceFile, strFile) then
  1485. begin
  1486. strText := FileArchiverManager.Alias[strFile];
  1487. zgProperties.Cells[1, Row].Text := strText;
  1488. zgBuildProjects.InvalidateRow(zgBuildProjects.CurRow);
  1489. OpenNewRelaFile(vTender, strText, strFile, FileType_PriceFile);
  1490. end;
  1491. end;
  1492. end;
  1493. procedure TScfrmBigProjManage.actnDelRelaFileUpdate(Sender: TObject);
  1494. var
  1495. Node: TZjGridTreeNode;
  1496. bEnabled: Boolean;
  1497. iType: Integer;
  1498. strAlias: string;
  1499. begin
  1500. bEnabled := False;
  1501. Node := ztRelaFiles.RowItems[zgRelaFiles.CurRow];
  1502. if Node <> nil then
  1503. begin
  1504. iType := -1;
  1505. if Node.Parent = FFeeParent then
  1506. iType := FileType_FeeFile
  1507. else if Node.Parent = FPriceParent then
  1508. iType := FileType_PriceFile;
  1509. strAlias := GetRelaFileName(zgRelaFiles.Cells[2, zgRelaFiles.CurRow].Text);
  1510. if (iType > 0) and (strAlias <> '') then
  1511. begin
  1512. // 只要有ProjectID 不等于 -1 的记录,就不能删除该文件
  1513. with FManageProjects do
  1514. begin
  1515. cdsRelaFiles.Filter := Format('(BuildProjectID=%d)AND(ProjectID<>-1)AND(FileType=%d)',
  1516. [CurBuildProjID, {zdProjects.DataSet.FieldByName(SID).AsInteger,} iType]);
  1517. cdsRelaFiles.Filtered := True;
  1518. cdsRelaFiles.First;
  1519. bEnabled := True;
  1520. while not cdsRelaFiles.Eof do
  1521. begin
  1522. if SameText(cdsRelaFilesName.AsString, strAlias) then
  1523. begin
  1524. bEnabled := False;
  1525. Break;
  1526. end;
  1527. cdsRelaFiles.Next;
  1528. end;
  1529. end;
  1530. end;
  1531. end;
  1532. TAction(Sender).Enabled := (SelectedBuildProject) and bEnabled;
  1533. end;
  1534. procedure TScfrmBigProjManage.actnDelRelaFileExecute(Sender: TObject);
  1535. var
  1536. Node: TZjGridTreeNode;
  1537. iType: Integer;
  1538. strAlias, strHint: string;
  1539. begin
  1540. Node := ztRelaFiles.RowItems[zgRelaFiles.CurRow];
  1541. if Node <> nil then
  1542. begin
  1543. iType := -1;
  1544. if Node.Parent = FFeeParent then
  1545. iType := FileType_FeeFile
  1546. else if Node.Parent = FPriceParent then
  1547. iType := FileType_PriceFile;
  1548. strAlias := GetRelaFileName(zgRelaFiles.Cells[2, zgRelaFiles.CurRow].Text);
  1549. case iType of
  1550. FileType_FeeFile: strHint := Format('确实要删除费率文件[%s]吗?', [strAlias]);
  1551. FileType_PriceFile: strHint := Format('确实要删除单价文件[%s]吗?', [strAlias]);
  1552. end;
  1553. if not MessageQuest(strHint) then Exit;
  1554. if (iType > 0) and (strAlias <> '') then
  1555. begin
  1556. // 只删除ProjectID等于 -1 的记录
  1557. with FManageProjects do
  1558. begin
  1559. cdsRelaFiles.Filter := Format('(BuildProjectID=%d)AND(ProjectID=-1)AND(FileType=%d)',
  1560. [CurBuildProjID, iType]);
  1561. cdsRelaFiles.Filtered := True;
  1562. cdsRelaFiles.First;
  1563. while not cdsRelaFiles.Eof do
  1564. begin
  1565. if SameText(cdsRelaFilesName.AsString, strAlias) then
  1566. begin
  1567. DeleteFileToRecycleBin(cdsRelaFilesFileName.AsString, False);
  1568. cdsRelaFiles.Delete;
  1569. RefreshInfoView;
  1570. Break;
  1571. end;
  1572. cdsRelaFiles.Next;
  1573. end;
  1574. end;
  1575. end;
  1576. end;
  1577. end;
  1578. procedure TScfrmBigProjManage.actnRenameRelaFileUpdate(Sender: TObject);
  1579. var
  1580. Node: TZjTreeNode;
  1581. begin
  1582. if zgRelaFiles.CurCol <> 2 then
  1583. begin
  1584. TAction(Sender).Enabled := False;;
  1585. Exit;
  1586. end;
  1587. Node := ztRelaFiles.Items[zgRelaFiles.CurRow - zgRelaFiles.FixedRowCount];
  1588. if Node = nil then
  1589. begin
  1590. TAction(Sender).Enabled := False;;
  1591. Exit;
  1592. end;
  1593. if Node.Parent = nil then
  1594. begin
  1595. TAction(Sender).Enabled := False;
  1596. Exit;
  1597. end;
  1598. TAction(Sender).Enabled := (Node.Parent = FFeeParent) or (Node.Parent = FPriceParent);
  1599. end;
  1600. procedure TScfrmBigProjManage.actnRenameRelaFileExecute(Sender: TObject);
  1601. begin
  1602. zgRelaFiles.Editing := True;
  1603. end;
  1604. var
  1605. _OldAlias: string;
  1606. procedure TScfrmBigProjManage.zgRelaFilesCellTextChanged(Sender: TObject;
  1607. Col, Row: Integer);
  1608. var
  1609. Node: TZjTreeNode;
  1610. iFileType: Integer;
  1611. begin
  1612. Node := ztRelaFiles.Items[zgRelaFiles.CurRow - zgRelaFiles.FixedRowCount];
  1613. if Node = nil then
  1614. Exit;
  1615. if Node.Parent = nil then
  1616. Exit;
  1617. if FIsLoading then Exit;
  1618. if (Node.Parent = FFeeParent) or (Node.Parent = FPriceParent) then
  1619. begin
  1620. if Node.Parent = FFeeParent then
  1621. iFileType := FileType_FeeFile
  1622. else if Node.Parent = FPriceParent then
  1623. iFileType := FileType_PriceFile;
  1624. ProjectManager.RenameRelaFile(staBuildProjects.IDTree.Selected.ID,
  1625. GetRelaFileName(zgRelaFiles.Cells[Col, Row].Text), _OldAlias, iFileType);
  1626. zgBuildProjects.InvalidateRow(staBuildProjects.IDTree.Selected.MajorIndex + zgBuildProjects.FixedRowCount + 1,
  1627. staBuildProjects.IDTree.Selected.ChildCount);
  1628. end;
  1629. end;
  1630. procedure TScfrmBigProjManage.zgRelaFilesCellTextChanging(Sender: TObject;
  1631. const ACoord: TPoint; var NewValue: String; var Accept: Boolean);
  1632. const
  1633. C_FileTypes: array [FileType_FeeFile.. FileType_PriceFile] of string = ('费率', '单价');
  1634. var
  1635. Node: TZjTreeNode;
  1636. iID, iFileType: Integer;
  1637. I: Integer;
  1638. Ch: Char;
  1639. begin
  1640. if ACoord.Y <= zgRelaFiles.FixedRowCount - 1 then Exit;
  1641. if FIsLoading then Exit;
  1642. NewValue := Trim(NewValue);
  1643. for I := 1 to Length(NewValue) do
  1644. begin
  1645. Ch := NewValue[I];
  1646. if not ValidFileName(Ch) then
  1647. begin
  1648. //MessageHint('文件名称不能包含特殊字符。');
  1649. HintInvalidFileName;
  1650. Accept := False;
  1651. Exit;
  1652. end;
  1653. end;
  1654. if SameText(NewValue, GetRelaFileName(zgRelaFiles.Cells[ACoord.X, ACoord.Y].Text)) then
  1655. begin
  1656. Accept := False;
  1657. Exit;
  1658. end;
  1659. iID := staBuildProjects.IDTree.Selected.ID;
  1660. Node := ztRelaFiles.Items[zgRelaFiles.CurRow - zgRelaFiles.FixedRowCount];
  1661. if Node = nil then
  1662. Exit;
  1663. if Node.Parent = nil then
  1664. Exit;
  1665. if (Node.Parent = FFeeParent) or (Node.Parent = FPriceParent) then
  1666. begin
  1667. NewValue := GetRelaFileName(NewValue);
  1668. if Node.Parent = FFeeParent then
  1669. iFileType := FileType_FeeFile
  1670. else if Node.Parent = FPriceParent then
  1671. iFileType := FileType_PriceFile;
  1672. if ProjectManager.RelaFileExists(iID, NewValue, iFileType) then
  1673. begin
  1674. MessageHint(0, Format('%s文件[%s]已存在,请重新命名。', [c_FileTypes[iFileType], NewValue]));
  1675. Accept := False;
  1676. end;
  1677. end;
  1678. if Accept then
  1679. begin
  1680. _OldAlias := GetRelaFileName(zgRelaFiles.Cells[ACoord.X, ACoord.Y].Text);
  1681. NewValue := NewRelaFileDisplayName(NewValue);
  1682. end;
  1683. end;
  1684. procedure TScfrmBigProjManage.zgPropertiesGetCellEditor(Sender: TObject;
  1685. ACoord: TPoint; var AControl: TWinControl);
  1686. begin
  1687. if ACoord.X <> 1 then Exit;
  1688. case ACoord.Y of
  1689. {$IFDEF _ScNoFeeRate}8{$ELSE}10{$ENDIF}:
  1690. AControl := dtpEditDate;
  1691. {$IFDEF _ScNoFeeRate}15{$ELSE}17{$ENDIF}:
  1692. begin
  1693. cbbProperties.Clear;
  1694. cbbProperties.Items.Add('高速公路');
  1695. cbbProperties.Items.Add('一级公路');
  1696. cbbProperties.Items.Add('二级公路');
  1697. cbbProperties.Items.Add('三级公路');
  1698. cbbProperties.Items.Add('四级公路');
  1699. AControl := cbbProperties;
  1700. end;
  1701. {$IFNDEF _ScNoFeeRate}
  1702. 22:
  1703. begin
  1704. begin
  1705. cbbProfit.Clear;
  1706. cbbProfit.Items.Add('7.42');
  1707. if not _IsGuangDong then
  1708. begin
  1709. cbbProfit.Items.Add('6.68');
  1710. cbbProfit.Items.Add('5.94');
  1711. end;
  1712. AControl := cbbProfit;
  1713. end;
  1714. end;
  1715. 23:
  1716. begin
  1717. begin
  1718. cbbProperties.Clear;
  1719. cbbProperties.Items.Add('9');
  1720. // if not _IsGuangDong then
  1721. // cbbProperties.Items.Add('11.07');
  1722. // cbbProperties.Items.Add('市区3.41');
  1723. // cbbProperties.Items.Add('城乡3.35');
  1724. // cbbProperties.Items.Add('其他3.22');
  1725. // cbbProperties.Items.Add('市区3.48');
  1726. // cbbProperties.Items.Add('城乡3.41');
  1727. // cbbProperties.Items.Add('其他3.28');
  1728. AControl := cbbProperties;
  1729. end;
  1730. end;
  1731. {$ENDIF}
  1732. end;
  1733. end;
  1734. procedure TScfrmBigProjManage.zgPropertiesEditorLoadCell(Sender: TObject;
  1735. ACoord: TPoint; AControl: TWinControl);
  1736. begin
  1737. if (ACoord.X = 1) then
  1738. case ACoord.Y of
  1739. {$IFDEF _ScNoFeeRate}8{$ELSE}10{$ENDIF}:
  1740. begin
  1741. if zgProperties.Cells[ACoord.X, ACoord.Y].Text = '' then
  1742. dtpEditDate.Date := Date
  1743. else
  1744. dtpEditDate.Date := ScStrToDate(zgProperties.Cells[ACoord.X, ACoord.Y].Text);
  1745. end;
  1746. //15, 21:
  1747. // cbbProperties.Text := zgProperties.Cells[ACoord.X, ACoord.Y].Text;
  1748. end;
  1749. end;
  1750. procedure TScfrmBigProjManage.zgPropertiesEditorSaveCell(Sender: TObject;
  1751. ACoord: TPoint; AControl: TWinControl);
  1752. begin
  1753. if ACoord.X = 1 then
  1754. case ACoord.Y of
  1755. {$IFDEF _ScNoFeeRate}7{$ELSE}10{$ENDIF}:
  1756. zgProperties.Cells[ACoord.X, ACoord.Y].Text := FormatDateTime('yyyy-mm-dd', dtpEditDate.Date);
  1757. //15, 21:
  1758. // zgBuildProjects.Cells[ACoord.X, ACoord.Y].Text := cbbProperties.Text;
  1759. end;
  1760. zgBuildProjects.InvalidateRow(zgBuildProjects.CurRow);
  1761. end;
  1762. procedure TScfrmBigProjManage.actnSaveAsExecute(Sender: TObject);
  1763. var
  1764. strAlias, strFile, strNewFile, strTip: string;
  1765. bFirst, bCanSaveAsRelaFile, bSaveAsRelaFile: Boolean;
  1766. vTender, vNewTender, vBuildProj: TScProjManagerTreeNode;
  1767. begin
  1768. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  1769. if Assigned(vTender) then
  1770. vBuildProj := TScProjManagerTreeNode(vTender.Parent)
  1771. else
  1772. vBuildProj := nil;
  1773. if not vTender.IsTender then
  1774. raise Exception.Create('该功能仅适用于标段。');
  1775. if not Assigned(vTender) or not Assigned(vBuildProj) then
  1776. raise Exception.Create('另存为:数据错误。');
  1777. strAlias := vTender.Rec.Name.AsString;
  1778. strFile := ScExpandFileName(vTender.Rec.FileName.AsString);
  1779. bFirst := True;
  1780. bCanSaveAsRelaFile := CanSaveAsRelaFilesByProject(vTender);
  1781. bSaveAsRelaFile := bCanSaveAsRelaFile;
  1782. repeat
  1783. if bFirst then
  1784. begin
  1785. strTip := '请输入文件名:';
  1786. bFirst := False;
  1787. end
  1788. else
  1789. strTip := Format('文件[%s]已存在。'#13#10'请重新输入文件名:', [strAlias]);
  1790. if not ScSaveAsFile(strTip, strAlias, bCanSaveAsRelaFile, bSaveAsRelaFile) then Exit;
  1791. until ProjectManager.TendersRec(vBuildProj.ID, strAlias) = nil;
  1792. strNewFile := ConfigInfo.NewGUIDFileName;
  1793. if not CopyFile(PChar(strFile), PChar(strNewFile), True) then
  1794. begin
  1795. MessageWarning('Can not copy file');
  1796. Exit;
  1797. end;
  1798. FileArchiverManager.Alias[strNewFile] := strAlias;
  1799. vNewTender := ProjectManager.AddProject(strNewFile, vBuildProj.ID);
  1800. if bSaveAsRelaFile then
  1801. begin
  1802. SaveAsRelaFilesByProject(vBuildProj.ID, vTender, vNewTender);
  1803. RefreshPropertyView;
  1804. end;
  1805. end;
  1806. procedure TScfrmBigProjManage.actnSaveAsRelaFileExecute(Sender: TObject);
  1807. var
  1808. iID, iBPID, iType: Integer;
  1809. Node: TZjGridTreeNode;
  1810. strFile, strNewFile, strAlias, strNewAlias, strTip: string;
  1811. bFirst: Boolean;
  1812. begin
  1813. Node := ztRelaFiles.RowItems[zgRelaFiles.CurRow];
  1814. if (Node = nil) then
  1815. Exit;
  1816. iID := Integer(Node.Data);
  1817. with ProjectManager do
  1818. begin
  1819. cdsRelaFiles.Filtered := False;
  1820. if cdsRelaFiles.Locate('ID', iID, []) then
  1821. begin
  1822. strFile := ScExpandFileName(cdsRelaFilesFileName.AsString);
  1823. strAlias := cdsRelaFilesName.AsString;
  1824. iType := cdsRelaFilesFileType.AsInteger;
  1825. end;
  1826. end;
  1827. iBPID := staBuildProjects.IDTree.Selected.ID;
  1828. bFirst := True;
  1829. strNewAlias := strAlias;
  1830. repeat
  1831. if bFirst then
  1832. begin
  1833. strTip := '请输入文件名:';
  1834. bFirst := False;
  1835. end
  1836. else
  1837. strTip := Format('文件[%s]已存在。'#13#10'请重新输入文件名:', [strNewAlias]);
  1838. if not ScInputQuery('另存文件', strTip, strNewAlias, False, True) then Exit;
  1839. until not ProjectManager.RelaFileExists(iBPID, strNewAlias, iType);
  1840. (* strNewFile := ConfigInfo.NewGUIDFileName;
  1841. if not CopyFile(PChar(strFile), PChar(strNewFile), True) then
  1842. begin
  1843. MessageWarning('Can not copy file');
  1844. Exit;
  1845. end;
  1846. FileArchiverManager.Alias[strNewFile] := strAlias;
  1847. ProjectManager.AddRelaFile(strNewFile, iBPID, False);*)
  1848. SaveAsRelaFile(iBPID, strFile, strNewAlias, strAlias, iType, False);
  1849. RefreshInfoView;
  1850. end;
  1851. function TScfrmBigProjManage.FindFeeTaxFile(AProjectID: Integer): string;
  1852. var
  1853. PropRec: TsdDataRecord;
  1854. begin
  1855. Result := '';
  1856. PropRec := ProjectManager.PropertiesRec(AProjectID);
  1857. if PropRec <> nil then
  1858. Result := PropRec.ValueByName('Value3').AsString;
  1859. end;
  1860. function TScfrmBigProjManage.GetRelaFileName(ADisplayName: string): string;
  1861. var
  1862. I: Integer;
  1863. begin
  1864. Result := ADisplayName;
  1865. if Length(ADisplayName) < Length(C_Indent) then Exit;
  1866. for I := 1 to Length(C_Indent) do
  1867. if ADisplayName[I] <> ' ' then Exit;
  1868. Delete(Result, 1, Length(C_Indent));
  1869. end;
  1870. function TScfrmBigProjManage.NewRelaFileDisplayName(AName: string): string;
  1871. begin
  1872. Result := C_Indent + AName;
  1873. end;
  1874. procedure TScfrmBigProjManage.zgRelaFilesGetCellText(Sender: TObject;
  1875. const ACoord: TPoint; var Value: String; DisplayText: Boolean);
  1876. begin
  1877. if not DisplayText then Value := GetRelaFileName(Value);
  1878. end;
  1879. function TScfrmBigProjManage.ImportBudgetProject(
  1880. const ABudgetProjFile: string): Boolean;
  1881. var
  1882. Importer: TScBuildProjectSaver;
  1883. I: Integer;
  1884. iFileType, iFlag: Integer;
  1885. strFile, strOldFile, strNewFile, strBPName, strBPFullName, strAlias, strName, strPath: string;
  1886. slstProj, slstImportProj: TStringList;
  1887. bRenamed: Boolean;
  1888. strOldVer, strNewVer: string;
  1889. vSelect, vBuildProj: TScProjManagerTreeNode;
  1890. begin
  1891. Result := True;
  1892. // 先验证是不是固化清单文件包, 固化清单包不可以在这里导入的
  1893. if IsStaticBillsPackage(ABudgetProjFile) then
  1894. begin
  1895. Result := False;
  1896. MessageWarning(Application.Handle, '导入失败!.stb文件为固化清单格式,请使用固化清单按钮接收文件。');
  1897. Exit;
  1898. end;
  1899. vSelect := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  1900. if Assigned(vSelect) and vSelect.IsTender then
  1901. vBuildProj := TScProjManagerTreeNode(vSelect.Parent)
  1902. else
  1903. vBuildProj := vSelect;
  1904. if not Assigned(vBuildProj) then Exit;
  1905. //strFile := ABudgetProjFile;
  1906. strFile := GetTempFileName;
  1907. try
  1908. CopyFile(PChar(ABudgetProjFile), PChar(strFile), False);
  1909. // 固化清单 导入标段兼容
  1910. if IsSmartCostProjectFile(strFile) or IsStaticBillsFile(strFile) then
  1911. begin
  1912. CheckAlias(strFile, ExtractFileNameWithoutExt(ABudgetProjFile));
  1913. strAlias := FileArchiverManager.Alias[strFile];
  1914. bRenamed := False;
  1915. while ProjectManager.TendersRec(vBuildProj.ID, strAlias) <> nil do
  1916. begin
  1917. if not ScInputQuery('重命名',
  1918. Format('[%s]已存在,如确实需要导入该文件,请重命名', [strAlias]), strAlias, False, True)
  1919. then
  1920. begin
  1921. Result := False;
  1922. Exit;
  1923. end;
  1924. bRenamed := True;
  1925. end;
  1926. strNewFile := ConfigInfo.NewGUIDFileName;
  1927. CopyFile(PChar(strFile), PChar(strNewFile), True);
  1928. if bRenamed then
  1929. FileArchiverManager.Alias[strNewFile] := strAlias
  1930. else
  1931. CheckAlias(strNewFile, strAlias);
  1932. ProjectManager.AddProject(strNewFile, vBuildProj.ID);
  1933. RefreshInfoView;
  1934. end
  1935. else
  1936. begin
  1937. Importer := TScBuildProjectSaver.Create;
  1938. try
  1939. // smbx、smpx文件
  1940. if not Importer.CanImport(ABudgetProjFile, strOldVer, strNewVer) then
  1941. begin
  1942. MessageWarning(0, Format('导入失败:您要导入的文件是由%s版本导出,当前软件是%s版本,请选择正确的版本再进行操作!',
  1943. [strOldVer, strNewVer]), '系统提醒');
  1944. Exit;
  1945. end;
  1946. if Importer.OpenProject(ABudgetProjFile) then
  1947. begin
  1948. strName := ExtractFileNameWithoutExt(ABudgetProjFile);
  1949. Screen.Cursor := crHourGlass;
  1950. try
  1951. Importer.ImportProject(strName);
  1952. finally
  1953. Screen.Cursor := crDefault;
  1954. end;
  1955. end;
  1956. strBPName := staBuildProjects.IDTree.Selected.Rec.ValueByName('Name').AsString;
  1957. strBPFullName := ProjectManager.CompleteBuildProjName(vBuildProj.ID);
  1958. slstProj := TStringList.Create;
  1959. slstImportProj := TStringList.Create;
  1960. try
  1961. slstProj.Assign(Importer.FileList);
  1962. if SelectProjectPackageFiles(slstProj, vBuildProj.ID) then
  1963. begin
  1964. for I := 0 to slstProj.Count - 1 do
  1965. begin
  1966. strOldFile := slstProj[I];
  1967. iFileType := GetFileType(strOldFile);
  1968. CheckAlias(strOldFile);
  1969. strAlias := FileArchiverManager.Alias[strOldFile];
  1970. // flag:1表示不存在此文件,可以直接解压到指定位置;其他(2)表示存在同名文件,导入时覆盖此文件
  1971. iFlag := Integer(slstProj.Objects[I]);
  1972. case iFileType of
  1973. // 固化清单 ,文件类型
  1974. FileType_Project, FileType_StaticBills:
  1975. begin
  1976. if iFlag = 1 then
  1977. strNewFile := ConfigInfo.NewGUIDFileName
  1978. else
  1979. strNewFile := ProjectManager.TenderFileName(strBPFullName, strAlias);
  1980. // 项目文件无论是否已存在,都要再添加一次,以便读取项目属性。
  1981. // 如果已经存在,不会重复添加
  1982. slstImportProj.Add(strNewFile);
  1983. CopyFile(PChar(strOldFile), PChar(strNewFile), False);
  1984. end;
  1985. FileType_FeeFile, FileType_PriceFile:
  1986. begin
  1987. if iFlag = 1 then
  1988. begin
  1989. strNewFile := ConfigInfo.NewGUIDFileName;
  1990. slstImportProj.Add(strNewFile);
  1991. end
  1992. else
  1993. strNewFile := ProjectManager.GetRelaFileName(vBuildProj.ID, strAlias, iFileType);
  1994. CopyFile(PChar(strOldFile), PChar(strNewFile), False);
  1995. end;
  1996. FileType_RationLib:
  1997. begin
  1998. case iFlag of
  1999. 1:
  2000. begin
  2001. strPath := ConfigInfo.RationLibPath;
  2002. strNewFile := strPath + ExtractFileName(strOldFile);
  2003. if FileExists(strNewFile) then
  2004. begin
  2005. if SameFileSize(strNewFile, strOldFile) then
  2006. Continue
  2007. else
  2008. begin
  2009. strPath := ConfigInfo.ImportRationLibPath + strBPName + '\';
  2010. strNewFile := strPath + ExtractFileName(strOldFile);
  2011. end;
  2012. end;
  2013. if not FileExists(strNewFile) then
  2014. begin
  2015. if not DirectoryExists(strPath) then
  2016. CreateFullDir(strPath);
  2017. CopyFile(PChar(strOldFile), PChar(strNewFile), True);
  2018. slstImportProj.Add(strNewFile);
  2019. end;
  2020. end;
  2021. 2:
  2022. begin
  2023. strNewFile := ProjectManager.GetRelaFileName(vBuildProj.ID, strAlias, iFileType);
  2024. CopyFile(PChar(strOldFile), PChar(strNewFile), False);
  2025. end;
  2026. 5:
  2027. begin
  2028. //ProjectManager.AddRelaFile();
  2029. end;
  2030. end;
  2031. end;
  2032. end;
  2033. end;
  2034. FManageProjects.AddExistProjects(slstImportProj, vBuildProj.ID);
  2035. end;
  2036. finally
  2037. slstImportProj.Free;
  2038. slstProj.Free;
  2039. end;
  2040. RefreshInfoView;
  2041. finally
  2042. Importer.Free;
  2043. end;
  2044. end;
  2045. finally
  2046. DeleteFile(strFile);
  2047. end;
  2048. end;
  2049. function TScfrmBigProjManage.ExportBudgetProject(AID: Integer;
  2050. const ABuildProject, AProjectName, ASourceFile, ABudgetProjFile: string): Boolean;
  2051. var
  2052. I: Integer;
  2053. strFeeTaxFile, strFile: string;
  2054. Exporter: TScBuildProjectSaver;
  2055. vTender, vBuildProj: TScProjManagerTreeNode;
  2056. begin
  2057. // Chenshilong, 2010-8-3 22:04:01 导出前保存
  2058. for I := 0 to ProjList.Count - 1 do
  2059. begin
  2060. if SameText(ProjList.ProjData[i].FileName, ASourceFile) then
  2061. begin
  2062. ProjList.ProjData[i].Save;
  2063. Break;
  2064. end;
  2065. end;
  2066. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.FindNode(AID));
  2067. if vTender.IsTender then
  2068. vBuildProj := TScProjManagerTreeNode(vTender.Parent)
  2069. else
  2070. vBuildProj := nil;
  2071. if (not Assigned(vBuildProj)) or (not vBuildProj.IsBuildProj) then
  2072. raise Exception.Create('导出分段文件:数据错误。');
  2073. strFile := ABudgetProjFile;
  2074. Exporter := TScBuildProjectSaver.Create;
  2075. try
  2076. Exporter.AddExportFile(ASourceFile);
  2077. strFeeTaxFile := FindFeeTaxFile(AID);
  2078. if FileExists(strFeeTaxFile) then
  2079. Exporter.AddExportFile(strFeeTaxFile, FileType_FeeTaxFile);
  2080. with FManageProjects do
  2081. begin
  2082. cdsRelaFiles.Filtered := False;
  2083. cdsRelaFiles.Filter := Format('(BuildProjectID=%d) AND (ProjectID=%d)', [vBuildProj.ID, AID]);
  2084. cdsRelaFiles.Filtered := True;
  2085. cdsRelaFiles.First;
  2086. while not cdsRelaFiles.Eof do
  2087. begin
  2088. Exporter.AddExportFile(cdsRelaFilesFileName.Value);
  2089. cdsRelaFiles.Next;
  2090. end;
  2091. cdsRelaFiles.Filtered := False;
  2092. end;
  2093. // 导出我的工料机
  2094. Exporter.AddExportFile(DefaultGLJLibFile);
  2095. Exporter.ExportProject(vBuildProj.ID, ABuildProject, strFile);
  2096. finally
  2097. Exporter.Free;
  2098. end;
  2099. end;
  2100. procedure TScfrmBigProjManage.ImportAndOpenBudgetProject(ABuildProjName,
  2101. ABudgetProjFile: string);
  2102. begin
  2103. if ImportBuildProjectIfNotExists(ABuildProjName) then
  2104. begin
  2105. if ImportBudgetProject(ABudgetProjFile) then
  2106. actnOpen.Execute
  2107. else
  2108. {$IFDEF _CostService}csParams.HasDownLoad := False{$ENDIF};
  2109. end;
  2110. end;
  2111. function TScfrmBigProjManage.ImportBuildProjectIfNotExists(
  2112. ABuildProjName: string): Boolean;
  2113. var
  2114. ProjItem: TScProjManagerTreeNode;
  2115. begin
  2116. ProjItem := FManageProjects.FindBuildProjectWithFull(ABuildProjName);
  2117. if not Assigned(ProjItem) then
  2118. ProjItem := FManageProjects.AddBuildProjectWithFull(ABuildProjName);
  2119. FManageProjects.LocateBuildProject(ProjItem.ID);
  2120. Result := True;
  2121. end;
  2122. procedure TScfrmBigProjManage.ClearRelaFilesView;
  2123. begin
  2124. if FRationParent <> nil then
  2125. FRationParent.DeleteChildren;
  2126. if FFeeParent <> nil then
  2127. FFeeParent.DeleteChildren;
  2128. if FPriceParent <> nil then
  2129. FPriceParent.DeleteChildren;
  2130. end;
  2131. procedure TScfrmBigProjManage.ExportCurBuildProject(const AFileName: string);
  2132. var
  2133. vNode: TScProjManagerTreeNode;
  2134. iID: Integer;
  2135. sName: string;
  2136. begin
  2137. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  2138. if vNode.IsBuildProj then
  2139. ExportBuildProject(vNode.ID, vNode.Rec.Name.AsString, AFileName);
  2140. end;
  2141. function TScfrmBigProjManage.CurSelNodeIsBP: Boolean;
  2142. var
  2143. vNode: TScProjManagerTreeNode;
  2144. begin
  2145. Result := False;
  2146. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  2147. if vNode.IsBuildProj then Result := True;
  2148. end;
  2149. procedure TScfrmBigProjManage.ExpXML_QG;
  2150. var
  2151. vNode: TScProjManagerTreeNode;
  2152. iID, i: Integer;
  2153. sFileName, sExt: string;
  2154. vPort: TQGXMLPort;
  2155. svDlg: TSaveDialog;
  2156. vTenderList: TList;
  2157. vType: TScProjType;
  2158. tenderRec: TsdDataRecord;
  2159. pbData: TScProjBaseData;
  2160. vProject: TScProject;
  2161. isNewOpen: Boolean;
  2162. begin
  2163. svDlg := TSaveDialog.Create(nil);
  2164. vTenderList := TList.Create;
  2165. vPort := TQGXMLPort.Create;
  2166. try
  2167. svDlg.InitialDir := ExtractFilePath(Application.ExeName) + 'UserData\接口';
  2168. svDlg.Title := '导出文件' ;
  2169. svDlg.Filter := '造价数据文件新全国(*.jygs;*.gkgs;*.sjgs;*.sgys;*.qdys;*.gcjs;*.sjys)|*.jygs;*.gkgs;*.sjgs;*.sgys;*.qdys;*.gcjs;*.sjys';
  2170. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  2171. svDlg.FileName := vNode.Rec.Name.AsString;
  2172. if not svDlg.Execute then Exit;
  2173. FManageProjects.LoadBuildProjectTenders(CurBuildProjID, vTenderList);
  2174. if vTenderList.Count = 0 then Exit;
  2175. try
  2176. CreateProgressForm(100, '导出XML文件>>>');
  2177. AddProgressForm(20, '正在后台打开第 1 个项目...');
  2178. // 单机版中,建设项目没有项目类型,且建设项目下可以有不同的项目类型。这里取第一标段的项目类型。
  2179. vProject := GetProjectByTenderRec(TsdDataRecord(vTenderList[0]), isNewOpen);
  2180. vType := vProject.ProjType;
  2181. finally
  2182. CloseProgressForm(True);
  2183. end;
  2184. sExt := LowerCase(ExtractFileExt(svDlg.FileName));
  2185. if (vType = ptProposalEstimate) and (sExt <> '.jygs') then
  2186. svDlg.FileName := svDlg.FileName + '.jygs';
  2187. if (vType = ptFeasibilityEstimate) and (sExt <> '.gkgs') then
  2188. svDlg.FileName := svDlg.FileName + '.gkgs';
  2189. if (vType = ptBudgetEstimate) and (sExt <> '.sjgs') then
  2190. svDlg.FileName := svDlg.FileName + '.sjgs';
  2191. if (vType = ptBudget) and (sExt <> '.sgys') then
  2192. svDlg.FileName := svDlg.FileName + '.sgys';
  2193. if (vType = ptBills) and (sExt <> '.qdys') then
  2194. svDlg.FileName := svDlg.FileName + '.qdys';
  2195. if (vType = ptFinal) and (sExt <> '.gcjs') then
  2196. svDlg.FileName := svDlg.FileName + '.gcjs';
  2197. if (vType = ptBillsBudget) and (sExt <> '.sjys') then
  2198. svDlg.FileName := svDlg.FileName + '.sjys';
  2199. for i := 0 to vTenderList.Count - 1 do
  2200. vPort.TenderRecList.Add(vTenderList[i]);
  2201. vPort.BuildProjRec := ProjectManager.PropertiesRec(CurBuildProjID);
  2202. vPort.FileType := xftTB;
  2203. vPort.Progressive := ProjectManager.GetSiteConstructType(CurBuildProjID) = gmCalculate;
  2204. vPort.Progressive2 := ProjectManager.GetProgressiveType(CurBuildProjID) = gmCalculate;
  2205. vPort.ProgressiveFile := CommonFeeLib.GetProgressiveFeeFile(ProjectManager.GetProgressiveFileID(CurBuildProjID));
  2206. vPort.XMLFile := svDlg.FileName;
  2207. vPort.FirtProjIsNewOpen := isNewOpen; // 这个很重要!后台打开的项目用完一定要关,否则会有车船税同步错误等。
  2208. vPort.SaveToXML;
  2209. finally
  2210. vTenderList.Free;
  2211. vPort.Free;
  2212. svDlg.Free;
  2213. end;
  2214. end;
  2215. // 浙江:项目管理-建设项目-导出多标段
  2216. procedure TScfrmBigProjManage.ExpXML_ZJ;
  2217. var
  2218. vNode: TScProjManagerTreeNode;
  2219. iID, i, iZTBType: Integer;
  2220. sName, sTimeName, spath, sExt, sXMLFile, sPDFFile, sZipFile: string;
  2221. vPort: TZTBXMLPort;
  2222. svDlg: TSaveDialog;
  2223. vTenderList: TList;
  2224. vType: TScProjType;
  2225. tenderRec: TsdDataRecord;
  2226. pbData: TScProjBaseData;
  2227. vProject: TScProject;
  2228. isNewOpen: Boolean;
  2229. strEncryptExe: string;
  2230. vFileList: TStringList;
  2231. bIsTender: Boolean;
  2232. begin
  2233. iZTBType := OpenTenderKindSelectForm(bIsTender);
  2234. case TXmlfileType(iZTBType) of
  2235. xftZB: sExt := '.zbjtgcl';
  2236. xftTB: sExt := '.tbjtgcl';
  2237. xftKZJ: sExt := '.xxx'; // 暂时用不上
  2238. end;
  2239. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  2240. sName := vNode.Rec.Name.AsString;
  2241. sTimeName := Format('jt-%d', [DateTimeToUnix(Now)]); // 10位时间戳(压缩包内用这个命名,压缩包外用项目名称命名)
  2242. svDlg := TSaveDialog.Create(nil);
  2243. svDlg.Options := svDlg.Options + [ofOverwritePrompt];
  2244. vTenderList := TList.Create;
  2245. vPort := TZTBXMLPort.Create;
  2246. vFileList := TStringList.Create;
  2247. PrepareExportPDF_ZheJiang(CurBuildProjID, iZTBType, bIsTender);
  2248. try
  2249. svDlg.InitialDir := ExtractFilePath(Application.ExeName) + 'UserData\接口';
  2250. svDlg.Title := '导出文件' ;
  2251. svDlg.Filter := '浙江电子标文件(.zbjtgcl;.tbjtgcl)|*.zbjtgcl;*.tbjtgcl';
  2252. svDlg.FileName := sName + sExt;
  2253. if not svDlg.Execute then Exit;
  2254. sPath := ExtractFilePath(svDlg.FileName);
  2255. sName := ExtractFileNameWithoutExt(svDlg.FileName);
  2256. FManageProjects.LoadBuildProjectTenders(CurBuildProjID, vTenderList);
  2257. if vTenderList.Count = 0 then Exit;
  2258. sXMLFile := sPath + sTimeName + '.xml';
  2259. sPDFFile := sPath + sTimeName + '.pdf';
  2260. sZipFile := sPath + sName + sExt;
  2261. try
  2262. CreateProgressForm(100, '导出XML文件>>>');
  2263. AddProgressForm(20, '正在后台打开第 1 个项目...');
  2264. // 单机版中,建设项目没有项目类型,且建设项目下可以有不同的项目类型。这里取第一标段的项目类型。
  2265. vProject := GetProjectByTenderRec(TsdDataRecord(vTenderList[0]), isNewOpen);
  2266. vType := vProject.ProjType;
  2267. finally
  2268. CloseProgressForm(True);
  2269. end;
  2270. // 添加项目数据事件
  2271. vPort.OnOpenProject := DoOnExportProjectXML;
  2272. // 添加多标段
  2273. for i := 0 to vTenderList.Count - 1 do
  2274. vPort.TenderRecList.Add(vTenderList[i]);
  2275. vPort.BuildProjRec := ProjectManager.PropertiesRec(CurBuildProjID);
  2276. vPort.XMLFile := sXMLFile;
  2277. vPort.FileType := TxmlFileType(iZTBType);
  2278. vPort.Area := areaZheJiang;
  2279. vPort.RootName := '浙江交通建设工程';
  2280. vPort.Progressive := ProjectManager.GetSiteConstructType(CurBuildProjID) = gmCalculate;
  2281. vPort.Progressive2 := ProjectManager.GetProgressiveType(CurBuildProjID) = gmCalculate;
  2282. vPort.ProgressiveFile := CommonFeeLib.GetProgressiveFeeFile(ProjectManager.GetProgressiveFileID(CurBuildProjID));
  2283. vPort.FirtProjIsNewOpen := isNewOpen; // 这个很重要!后台打开的项目用完一定要关,否则会有车船税同步错误等。
  2284. vPort.SaveToXML(False);
  2285. vFileList.Add(sXMLFile);
  2286. // 添加项目数据在DoOnExportProjectXML事件中
  2287. // 导出PDF
  2288. ExportPDF_ZheJiang(sPDFFile);
  2289. vFileList.Add(sPDFFile);
  2290. // 如果zip文件已存在,则并不会覆盖,而是把两次的文件一起压缩。所以这里要先删除。
  2291. if FileExists(sZipFile) then
  2292. SysUtils.DeleteFile(sZipFile);
  2293. vPort.ZipFiles(vFileList, sZipFile);
  2294. // 验证打包
  2295. strEncryptExe := AppPath + 'ZJEncrypt\ZJ_Encrypt.exe';
  2296. if FileExists(strEncryptExe) and FileExists(sZipFile) then
  2297. ShellExecute(0, 'open', PChar(strEncryptExe), PChar(sZipFile), PChar(AppPath), SW_HIDE);
  2298. finally
  2299. EndExportPDF_ZheJiang;
  2300. vTenderList.Free;
  2301. vPort.Free;
  2302. svDlg.Free;
  2303. vFileList.Free;
  2304. end;
  2305. end;
  2306. function TScfrmBigProjManage.GetCurrentBPName: string;
  2307. var
  2308. Node: TScProjManagerTreeNode;
  2309. begin
  2310. Node := TScProjManagerTreeNode(FManageProjects.ManagerTree.FindNode(CurBuildProjID));
  2311. if Assigned(Node) then
  2312. Result := Node.Rec.ValueByName('Name').AsString
  2313. else
  2314. Result := '';
  2315. end;
  2316. function TScfrmBigProjManage.OpenAllBudgetProjectOfCurrentBP: TScProjType;
  2317. var
  2318. Tenders: TList;
  2319. i: Integer;
  2320. Rec: TsdDataRecord;
  2321. projData: TScProjBaseData;
  2322. begin
  2323. Result := ptBillsBudget;
  2324. Tenders := TList.Create;
  2325. try
  2326. FManageProjects.LoadBuildProjectTenders(CurBuildProjID, Tenders);
  2327. for i := 0 to Tenders.Count - 1 do
  2328. begin
  2329. Rec := TsdDataRecord(Tenders.Items[i]);
  2330. if ProjList.IndexByName(Rec.ValueByName('FileName').AsString) = nil then
  2331. begin
  2332. projData := ProjList.AddProj(Rec.ValueByName('FileName').AsString);
  2333. projData.CreateProject;
  2334. projData.Project.OpenConnection;
  2335. ProjData.Project.DoAfterOpenConnection;
  2336. projData.Project.Open(oftOpen);
  2337. end
  2338. else
  2339. projData := ProjList.IndexByName(Rec.ValueByName('FileName').AsString);
  2340. result := ProjData.ProjType;
  2341. end;
  2342. finally
  2343. Tenders.Free;
  2344. end;
  2345. end;
  2346. procedure TScfrmBigProjManage.ImportBP(const AFileName: string);
  2347. var
  2348. Importer: TScBuildProjectSaver;
  2349. strName, strOldFile, strNewFile, strPath, strOldVer, strNewVer: string;
  2350. slstProj: TStringList;
  2351. I: Integer;
  2352. iNewID, iFileType, iFileID: Integer;
  2353. vProjBuild: TScProjManagerTreeNode;
  2354. fCoe: Double;
  2355. begin
  2356. Importer := TScBuildProjectSaver.Create;
  2357. try
  2358. if not Importer.CanImport(AFileName, strOldVer, strNewVer) then
  2359. begin
  2360. MessageWarning(0, Format('导入失败:您要导入的文件是由%s版本导出,当前软件是%s版本,请选择正确的版本再进行操作!',
  2361. [strOldVer, strNewVer]), '系统提醒');
  2362. Exit;
  2363. end;
  2364. if Importer.OpenProject(AFileName) then
  2365. begin
  2366. strName := ExtractFileNameWithoutExt(AFileName);
  2367. while FManageProjects.FindBuildProjectWithSelect(strName) <> nil do
  2368. begin
  2369. if not ScInputQuery('重命名', Format('建设项目[%s]已存在,请重新命名', [strName]), strName, False, True) then
  2370. Exit
  2371. else if strName = '' then
  2372. begin
  2373. MessageWarning('建设项目名不可为空。');
  2374. Exit;
  2375. end;
  2376. end;
  2377. Screen.Cursor := crHourGlass;
  2378. try
  2379. Importer.ImportProject(strName);
  2380. finally
  2381. Screen.Cursor := crDefault;
  2382. end;
  2383. end;
  2384. Screen.Cursor := crHourGlass;
  2385. // zhangyin:下面这一大段为什么会放在上面那个if的外面?显然不合理,但是为了保险起见,暂不做修改
  2386. try
  2387. vProjBuild := FManageProjects.AddBuildProjectWithSelect(strName, True);
  2388. iNewID := vProjBuild.ID;
  2389. vProjBuild.Rec.Author.AsString := Importer.Author;
  2390. vProjBuild.Rec.Auditor.AsString := Importer.Auditor;
  2391. vProjBuild.Rec.Principal.AsString := Importer.Principal;
  2392. if Importer.HasProperties then
  2393. ImportBPProperties(iNewID, Importer.Properties);
  2394. FManageProjects.SetProgressiveType(iNewID, TGatherMode(Importer.ProgressiveType));
  2395. FManageProjects.SetSiteConstructType(iNewID, TGatherMode(Importer.SiteConstructType));
  2396. iFileID := CommonFeeLib.FileIDByName(Importer.ProgressiveFile);
  2397. //if iFileID = -1 then
  2398. // iFileID := CommonFeeLib.DefaultFileID;
  2399. FManageProjects.SetProgressiveFileID(iNewID, iFileID);
  2400. fCoe := Importer.ProgressiveCoe;
  2401. if fCoe = 0 then fCoe := 1;
  2402. FManageProjects.SetProgressiveCoe(iNewID, fCoe);
  2403. slstProj := TStringList.Create;
  2404. try
  2405. for I := 0 to Importer.FileList.Count - 1 do
  2406. begin
  2407. strOldFile := Importer.FileList[I];
  2408. if not IsSmartCostFile(strOldFile) > 0 then Continue;
  2409. iFileType := GetFileType(strOldFile);
  2410. CheckAlias(strOldFile);
  2411. case iFileType of
  2412. FileType_Project, FileType_FeeFile, FileType_PriceFile, FileType_StaticBills:
  2413. begin
  2414. strNewFile := ConfigInfo.NewGUIDFileName;
  2415. CopyFile(PChar(strOldFile), PChar(strNewFile), True);
  2416. if (iFileType = FileType_Project) or (iFileType = FileType_StaticBills) then
  2417. begin
  2418. if Importer.HasSelection then
  2419. slstProj.AddObject(strNewFile, Pointer(Importer.ReadProjectSelection))
  2420. else
  2421. slstProj.AddObject(strNewFile, Pointer(True));
  2422. end
  2423. else
  2424. slstProj.Add(strNewFile);
  2425. end;
  2426. FileType_RationLib:
  2427. begin
  2428. strPath := ConfigInfo.RationLibPath;
  2429. strNewFile := strPath + ExtractFileName(strOldFile);
  2430. if FileExists(strNewFile) then
  2431. begin
  2432. if SameFileSize(strNewFile, strOldFile) then
  2433. begin
  2434. slstProj.Add(strNewFile);
  2435. Continue
  2436. end
  2437. else
  2438. begin
  2439. strPath := ConfigInfo.ImportRationLibPath + strName + '\';
  2440. strNewFile := strPath + ExtractFileName(strOldFile);
  2441. end;
  2442. end;
  2443. if not DirectoryExists(strPath) then
  2444. CreateFullDir(strPath);
  2445. CopyFile(PChar(strOldFile), PChar(strNewFile), False);
  2446. slstProj.Add(strNewFile);
  2447. end;
  2448. end;
  2449. end;
  2450. FManageProjects.AddExistProjects(slstProj, iNewID);
  2451. FManageProjects.AddRelaFiles(Importer.FileList, iNewID);
  2452. FManageProjects.CheckBMFeeFileAfterImportBP(iNewID);
  2453. finally
  2454. slstProj.Free;
  2455. end;
  2456. FManageProjects.LocateBuildProject(iNewID);
  2457. finally
  2458. Screen.Cursor := crDefault;
  2459. end;
  2460. finally
  2461. Importer.Free;
  2462. end;
  2463. end;
  2464. procedure TScfrmBigProjManage.ExtractBudgetProjectNames(AStrings: TStrings);
  2465. begin
  2466. FManageProjects.LoadBuildProjectTendersName(CurBuildProjID, AStrings);
  2467. end;
  2468. function TScfrmBigProjManage.IsPropertyCanEdit(
  2469. const ACoord: TPoint): Boolean;
  2470. const
  2471. // 要添加不允许编辑的行,在这里添加名字
  2472. CannotEditRowName: array[1..2] of string =
  2473. ( '利润率(%)',
  2474. '增值税税率(%)'
  2475. );
  2476. var
  2477. I: Integer;
  2478. AName, AFileName: string;
  2479. begin
  2480. AFileName := staBuildProjects.DataView.Current.ValueByName(SFileName).AsString;
  2481. Result := True;
  2482. if not IsStaticBillsFile(AFileName) then
  2483. begin
  2484. Result := True;
  2485. Exit;
  2486. end;
  2487. AName := Trim(zgProperties.Cells[0, ACoord.Y].Text);
  2488. for I := 1 to Length(CannotEditRowName) do
  2489. begin
  2490. if SameText(AName, CannotEditRowName[I]) then
  2491. begin
  2492. Result := False;
  2493. Exit;
  2494. end;
  2495. end;
  2496. end;
  2497. procedure TScfrmBigProjManage.actnOwnerExportExecute(Sender: TObject);
  2498. begin
  2499. ExportStaticBills('', True);
  2500. end;
  2501. procedure TScfrmBigProjManage.ExportStaticBills(ANewAlias: string; AIsOwner: Boolean);
  2502. var
  2503. vTender, vBuildProj: TScProjManagerTreeNode;
  2504. strFile, strAlias, strSourceAlias, strBPName,
  2505. strSourceFile, sStaticTmpFile, sRelaTempFile, tmpAlias: string;
  2506. I, iBPID, iProjID: Integer;
  2507. stbFileHead: TScFileHead;
  2508. tmpFile, aRelaFile, stbFile: TFileStream;
  2509. rFileHead, rRelaHead: TScFileHeadRec;
  2510. stbHead: TStaticBillsHead;
  2511. aRelaFileName, aRelaAlias, sPath: string;
  2512. bIsStaticBillsFile: Boolean;
  2513. begin
  2514. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  2515. if Assigned(vTender) then
  2516. vBuildProj := TScProjManagerTreeNode(vTender.Parent)
  2517. else
  2518. vBuildProj := nil;
  2519. if not Assigned(vTender) or not vTender.IsTender then
  2520. raise Exception.Create('请选择固化清单标段导出。');
  2521. if not Assigned(vBuildProj) or not vBuildProj.IsBuildProj then
  2522. raise Exception.Create('数据错误');
  2523. ScProgress(0, '正在导出固化清单...');
  2524. sdExport.Filter := GetDialogExtString(dtStaticBills);
  2525. if ANewAlias = '' then
  2526. strAlias := vTender.Rec.Name.AsString
  2527. else
  2528. strAlias := ANewAlias;
  2529. strFile := strAlias;
  2530. strBPName := vBuildProj.Rec.Name.AsString;
  2531. iBPID := vBuildProj.ID;
  2532. iProjID := vTender.ID;
  2533. strSourceAlias := vTender.Rec.Name.AsString;
  2534. strSourceFile := vTender.Rec.FileName.AsString;
  2535. // 业主每次导出都重新生成GUID
  2536. if AIsOwner then
  2537. begin
  2538. if IsFileHadExportedStaticBills(strSourceFile) then
  2539. begin
  2540. if MessageYesOrNo('重新生成固化清单后,之前生成的固化清单文件将作废。您是否要继续?') then
  2541. NewGUIDToNewSmpFile(strSourceFile)
  2542. else
  2543. Exit;
  2544. end
  2545. else
  2546. begin
  2547. NewGUIDToNewSmpFile(strSourceFile);
  2548. end;
  2549. end;
  2550. FixFileExt(strFile, SStaticBillsFileExt);
  2551. if Pos(':\', ConfigInfo.OutputPath) > 0 then
  2552. sPath := ConfigInfo.OutputPath
  2553. else
  2554. sPath := ExtractFilePath(Application.ExeName) + ConfigInfo.OutputPath;
  2555. sPath := sPath + strBPName + '\';
  2556. strFile := sPath + strFile;
  2557. if not DirectoryExists(sPath) then
  2558. ForceDirectories(sPath);
  2559. sdExport.FileName := strFile;
  2560. sStaticTmpFile := GetTempFileName; // 临时固化清单分段路径
  2561. if sdExport.Execute then
  2562. begin
  2563. for I := 0 to ProjList.Count - 1 do
  2564. begin
  2565. if SameText(ProjList.ProjData[i].Alias, strAlias) then
  2566. begin
  2567. // 如果项目是打开的,从源文件重新赋值新的GUID 6-26
  2568. ProjList.ProjData[i].ResetFileHeadSourceGUID(GetFileGUID(strSourceFile));
  2569. ProjList.ProjData[i].Save;
  2570. Break;
  2571. end;
  2572. end;
  2573. CreateProgressForm(100, '正在导出固化清单>>>');
  2574. AddProgressForm(10, '正在导出分段文件...');
  2575. strFile := sdExport.FileName;
  2576. // 如果存在同名文件,要先删除
  2577. if FileExists(strFile) then
  2578. DeleteFile(strFile);
  2579. FixFileExt(strFile, SStaticBillsFileExt);
  2580. // 先把分段复制到临时文件下
  2581. if not CopyFile(PChar(strSourceFile), PChar(sStaticTmpFile), False) then
  2582. begin
  2583. MessageWarning('Copy file failed');
  2584. Exit;
  2585. end;
  2586. // 下面对固化清单文件头写新的信息
  2587. // 先把临时清单文件固化
  2588. strAlias := ExtractFileNameWithoutExt(strFile);
  2589. FileArchiverManager.Alias[strFile] := strAlias;
  2590. FileArchiverManager.Alias[sStaticTmpFile] := strAlias;
  2591. // 先验证是不是固化清单文件,不是固化清单才修改文件头
  2592. // 也就是说,一旦导出成固化清单后,属于源就不可以改了
  2593. bIsStaticBillsFile := IsStaticBillsFile(sStaticTmpFile);
  2594. if not bIsStaticBillsFile then
  2595. begin
  2596. // 如果不是固化清单(是源文件)先清除定额数据
  2597. if not ClearRationsOfSourceBills(sStaticTmpFile) then
  2598. begin
  2599. MessageWarning('清除源文件定额数据出错!');
  2600. Exit;
  2601. end;
  2602. stbFileHead := ReadScFileHead(sStaticTmpFile);
  2603. // 6-15 固化清单新版
  2604. // 固化清单文件类型改为8,7只用在十天高速项目
  2605. // stbFileHead.FileType := 7; // 固化清单的文件类型=7
  2606. stbFileHead.FileType := 8; // 固化清单的文件类型=7
  2607. stbFileHead.SourceBPName := Trim(strBPName);
  2608. stbFileHead.SourceName := Trim(strSourceAlias);
  2609. // 源文件名GUID 经过MD5加密存在文件夹
  2610. stbFileHead.SourceFileName := GetFileGUID(strSourceFile);
  2611. tmpFile := TFileStream.Create(sStaticTmpFile, fmOpenWrite);
  2612. try
  2613. tmpFile.Position := 0;
  2614. tmpFile.Write(stbFileHead, SizeOf(stbFileHead));
  2615. finally
  2616. tmpFile.Free;
  2617. end;
  2618. // 设置源文件导出标志
  2619. // zhangyin 2012-09-28业主发布文件才设置标志
  2620. SetExportedStaticBillsFlag(strSourceFile, 1);
  2621. SetExportedStaticBillsFlag(sStaticTmpFile, 0);
  2622. end
  2623. else
  2624. begin
  2625. // 固化清单导出,项目文件也要清除处理
  2626. if not ClearRationsOfStaticBills(sStaticTmpFile) then
  2627. begin
  2628. DeleteFile(sStaticTmpFile);
  2629. CloseFloatProgress;
  2630. ScProgress(100);
  2631. Exit;
  2632. end;
  2633. // 重设固化清单导出标志 6-28
  2634. // zhangyin 2012-09-28业主发布文件才设置标志
  2635. SetExportedStaticBillsFlag(strSourceFile, 0);
  2636. SetExportedStaticBillsFlag(sStaticTmpFile, 0);
  2637. end;
  2638. // 然后导出临时分段和单价费率文件
  2639. try
  2640. // 固化清单导出文件
  2641. stbFile := TFileStream.Create(strFile, fmCreate);
  2642. // 先写固化清单文件头
  2643. ZeroMemory(@stbHead, SizeOf(stbHead));
  2644. // 6-15 固化清单新版 stb文件包类型改为2(类型=1的只用在十天高速项目)
  2645. // stbHead.IsStaticBillsFile := 1;
  2646. stbHead.IsStaticBillsFile := 2;
  2647. stbFile.Write(stbHead, SizeOf(stbHead));
  2648. // 临时分段
  2649. ZeroMemory(@rFileHead, SizeOf(rFileHead));
  2650. rFileHead.FileName := tmpAlias;
  2651. rFileHead.FileType := GetFileType(sStaticTmpFile);
  2652. tmpFile := TFileStream.Create(sStaticTmpFile, fmOpenRead);
  2653. rFileHead.Size := tmpFile.Size;
  2654. stbFile.Write(rFileHead, SizeOf(rFileHead));
  2655. tmpFile.Position := 0;
  2656. stbFile.CopyFrom(tmpFile, tmpFile.Size);
  2657. AddProgressForm(40, '正在导出费率文件...');
  2658. // 然后写入关联文件
  2659. with FManageProjects do
  2660. begin
  2661. cdsRelaFiles.Filtered := False;
  2662. cdsRelaFiles.Filter := Format('(BuildProjectID=%d) AND (ProjectID=%d)', [iBPID, iProjID]);
  2663. cdsRelaFiles.Filtered := True;
  2664. cdsRelaFiles.First;
  2665. while not cdsRelaFiles.Eof do
  2666. begin
  2667. // 关联文件
  2668. aRelaFileName := cdsRelaFilesFileName.AsString;
  2669. // 如果关联文件不存在就下一个 且不导出定额库
  2670. if (FileExists(aRelaFileName)) and (cdsRelaFilesFileType.AsInteger <> 1) then
  2671. begin
  2672. sRelaTempFile := GetTempFileName; // 临时路径
  2673. // 费率单价不这样复制源文件了,直接到目录下复制模版文件
  2674. if not CopyFile(PChar(aRelaFileName), PChar(sRelaTempFile), False) then
  2675. begin
  2676. MessageWarning('Copy file failed');
  2677. Exit;
  2678. end;
  2679. // 如果是业主导出,先清楚单价费率修改
  2680. if not bIsStaticBillsFile then
  2681. begin
  2682. if cdsRelaFilesFileType.AsInteger = 2 then
  2683. ClearFeeFile(sRelaTempFile)
  2684. else if cdsRelaFilesFileType.AsInteger = 3 then
  2685. ClearPriceFile(sRelaTempFile);
  2686. end;
  2687. aRelaAlias := cdsRelaFilesName.AsString;
  2688. FileArchiverManager.Alias[sRelaTempFile] := aRelaAlias;
  2689. try
  2690. // 单价费率就导出
  2691. ZeroMemory(@rRelaHead, SizeOf(rRelaHead));
  2692. rRelaHead.FileName := aRelaAlias;
  2693. rRelaHead.FileType := GetFileType(sRelaTempFile);
  2694. aRelaFile := TFileStream.Create(sRelaTempFile, fmOpenRead);
  2695. rRelaHead.Size := aRelaFile.Size;
  2696. stbFile.Write(rRelaHead, SizeOf(rRelaHead));
  2697. aRelaFile.Position := 0;
  2698. stbFile.CopyFrom(aRelaFile, aRelaFile.Size);
  2699. finally
  2700. DeleteFile(sRelaTempFile);
  2701. aRelaFile.Free;
  2702. end;
  2703. end;
  2704. AddProgressForm(20, '正在导出单价文件...');
  2705. cdsRelaFiles.Next;
  2706. end;
  2707. cdsRelaFiles.Filtered := False;
  2708. end;
  2709. finally
  2710. tmpFile.Free;
  2711. DeleteFile(sStaticTmpFile);
  2712. stbFile.Free;
  2713. end;
  2714. end;
  2715. CloseFloatProgress;
  2716. ScProgress(100);
  2717. end;
  2718. procedure TScfrmBigProjManage.actnOwnerImportExecute(Sender: TObject);
  2719. begin
  2720. odImport.Filter := GetDialogExtString(dtStaticBills);
  2721. if odImport.Execute then
  2722. ImportStaticBills(odImport.FileName, True);
  2723. end;
  2724. procedure TScfrmBigProjManage.ImportStaticBills(const AFileName: string; AIsOwner: Boolean);
  2725. var
  2726. stbFilePackege, strFile, strNewFile, strAlias, sBidderName: string;
  2727. sSourceBPName, sSourceName, sSourceFileName, sSourceFileMD5: string;
  2728. stbFileHead: TScFileHead;
  2729. bRenamed: Boolean;
  2730. iPosition, iProjID: Integer;
  2731. aBillFile, aRelaFile, stbPackegeFile: TFileStream;
  2732. stbHead: TStaticBillsHead;
  2733. rBillhead, rRelaHead: TScFileHeadRec;
  2734. vBPNode: TScProjManagerTreeNode;
  2735. begin
  2736. stbFilePackege := GetTempFileName;
  2737. try
  2738. CopyFile(PChar(AFileName), PChar(stbFilePackege), False);
  2739. // 先验证是不是固化清单文件包
  2740. if not IsStaticBillsPackage(stbFilePackege) then
  2741. begin
  2742. MessageWarning(0, '您导入的文件不属于固化清单文件!');
  2743. Exit;
  2744. end;
  2745. // 先从分段导入 \ 固化分段先暂时存到临时文件
  2746. strFile := GetTempFileName;
  2747. try
  2748. stbPackegeFile := TFileStream.Create(stbFilePackege, fmOpenRead);
  2749. stbPackegeFile.Read(stbHead, SizeOf(stbHead));
  2750. stbPackegeFile.Read(rBillhead, SizeOf(rBillhead));
  2751. // 先是从包中复制出固化分段
  2752. try
  2753. aBillFile := TFileStream.Create(strFile, fmCreate);
  2754. aBillFile.CopyFrom(stbPackegeFile, rBillhead.Size);
  2755. finally
  2756. aBillFile.Free;
  2757. end;
  2758. if IsStaticBillsFile(strFile) then
  2759. begin
  2760. // 下面校验是否是源文件导出的固化清单
  2761. // 校验开始
  2762. if AIsOwner then
  2763. begin
  2764. if not IsOwnerStaticBills(strFile) then
  2765. begin
  2766. MessageHint(0, '找不到源文件,请业主在源文件所在建设项目下接收数据。'+ #13#10 + '或此文件不是业主最后导出的固化清单!');
  2767. DeleteFile(strFile);
  2768. Exit;
  2769. end;
  2770. end;
  2771. // 校验结束
  2772. CheckAlias(strFile);
  2773. strAlias := FileArchiverManager.Alias[strFile];
  2774. bRenamed := False;
  2775. // 如果不是业主要输入投标单位的名称
  2776. if not AIsOwner then
  2777. begin
  2778. sBidderName := '';
  2779. while sBidderName = '' do
  2780. begin
  2781. if not ScInputQuery('投标单位', '请输入投标单位的名称:', sBidderName, False, True)
  2782. then
  2783. begin
  2784. DeleteFile(strFile);
  2785. Exit;
  2786. end;
  2787. end;
  2788. strAlias := Trim(strAlias) + '【' + Trim(sBidderName) + '】';
  2789. bRenamed := True;
  2790. end;
  2791. vBPNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  2792. if (vBPNode.IsTender) then
  2793. vBPNode := TScProjManagerTreeNode(vBPNode.Parent);
  2794. while ProjectManager.TendersRec(vBPNode.ID, strAlias) <> nil do
  2795. begin
  2796. if not ScInputQuery('重命名',
  2797. Format('[%s]已存在,如确实需要导入该文件,请重命名', [strAlias]), strAlias, False, True)
  2798. then
  2799. begin
  2800. DeleteFile(strFile);
  2801. Exit;
  2802. end;
  2803. bRenamed := True;
  2804. end;
  2805. strNewFile := ConfigInfo.NewGUIDFileName;
  2806. CopyFile(PChar(strFile), PChar(strNewFile), True);
  2807. if bRenamed then
  2808. FileArchiverManager.Alias[strNewFile] := strAlias
  2809. else
  2810. CheckAlias(strNewFile, strAlias);
  2811. ProjectManager.AddProject(strNewFile, vBPNode.ID);
  2812. // 获取分段ID
  2813. iProjID := ProjectManager.GetProjectID(strNewFile);
  2814. RefreshInfoView;
  2815. // 删除分段临时文件
  2816. DeleteFile(strFile);
  2817. end
  2818. else
  2819. begin
  2820. DeleteFile(strFile);
  2821. MessageHint(0 , '导入失败!该文件不属于固化清单文件!');
  2822. Exit;
  2823. end;
  2824. // 下面导入关联文件 ,关联文件不再建立临时文件,直接创建新文件
  2825. // 先设置当前固化包的文件指针
  2826. stbPackegeFile.Position := rBillhead.Size + SizeOf(stbHead) + SizeOf(rBillhead);
  2827. while stbPackegeFile.Position < stbPackegeFile.Size do
  2828. begin
  2829. stbPackegeFile.Read(rRelaHead, SizeOf(rRelaHead));
  2830. strNewFile := ConfigInfo.NewGUIDFileName;
  2831. try
  2832. aRelaFile := TFileStream.Create(strNewFile, fmCreate);
  2833. aRelaFile.CopyFrom(stbPackegeFile, rRelaHead.Size);
  2834. finally
  2835. aRelaFile.Free;
  2836. end;
  2837. // zhangyin 2012-07-27投标单位接收相关文件要保持原文件名,且修改后要同步项目属性
  2838. if (not AIsOwner) and (rRelaHead.FileType in [FileType_FeeFile, FileType_PriceFile]) then
  2839. begin
  2840. strAlias := FileArchiverManager.Alias[strNewFile];
  2841. strAlias := Trim(strAlias) + '【' + Trim(sBidderName) + '】';
  2842. FileArchiverManager.Alias[strNewFile] := strAlias;
  2843. if rRelaHead.FileType = FileType_PriceFile then
  2844. FManageProjects.ChangeProperties(iProjID, 'Value4', strAlias)
  2845. else if rRelaHead.FileType = FileType_FeeFile then
  2846. FManageProjects.ChangeProperties(iProjID, 'Value3', strAlias);
  2847. end;
  2848. FManageProjects.AddRelaFile(strNewFile, CurBuildProjID, iProjID);
  2849. end;
  2850. RefreshInfoView;
  2851. finally
  2852. stbPackegeFile.Free;
  2853. end;
  2854. finally
  2855. DeleteFile(stbFilePackege);
  2856. end;
  2857. end;
  2858. procedure TScfrmBigProjManage.actnBidderExportExecute(Sender: TObject);
  2859. begin
  2860. ExportStaticBills('', False);
  2861. end;
  2862. procedure TScfrmBigProjManage.actnBidderImportExecute(Sender: TObject);
  2863. begin
  2864. odImport.Filter := GetDialogExtString(dtStaticBills);
  2865. if odImport.Execute then
  2866. ImportStaticBills(odImport.FileName, False);
  2867. end;
  2868. function TScfrmBigProjManage.IsOwnerStaticBills(AFileName: string): Boolean;
  2869. var
  2870. stbFileHead: TScFileHead;
  2871. bBeyondOwner: Boolean;
  2872. sSourceBPName, sSourceName, sSourceFileName, sSbtFileMD5, sSourceFileMD5: string;
  2873. vBPNode: TScProjManagerTreeNode;
  2874. begin
  2875. if (Trim(AFileName) = '') or (not FileExists(Trim(AFileName))) then
  2876. Exit;
  2877. bBeyondOwner := False;
  2878. stbFileHead := ReadScFileHead(AFileName);
  2879. sSourceBPName := Trim(stbFileHead.SourceBPName);
  2880. vBPNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  2881. if (vBPNode.IsTender) then
  2882. vBPNode := TScProjManagerTreeNode(vBPNode.Parent);
  2883. //验证当前建设项目是否为源项目 不是源文件的当前建设项目 就返回False
  2884. if not SameText(Trim(sSourceBPName), Trim(vBPNode.Rec.Name.AsString)) then
  2885. begin
  2886. Result := False;
  2887. Exit;
  2888. end;
  2889. sSourceName := Trim(stbFileHead.SourceName);
  2890. sSbtFileMD5 := Trim(stbFileHead.SourceFileName);
  2891. sSourceFileName := ProjectManager.TenderFileName(vBPNode.ID, sSourceName);
  2892. if SameText(Trim(sSourceFileName), '') then
  2893. begin
  2894. Result := False;
  2895. Exit;
  2896. end;
  2897. sSourceFileMD5 := GetFileGUID(sSourceFileName);
  2898. bBeyondOwner := SameText(sSbtFileMD5, sSourceFileMD5);
  2899. Result := bBeyondOwner;
  2900. end;
  2901. procedure TScfrmBigProjManage.NewGUIDToNewSmpFile(
  2902. AFileName: string);
  2903. var
  2904. sFile: string;
  2905. smbFileHead: TScFileHead;
  2906. smbFile: TFileStream;
  2907. begin
  2908. sFile := Trim(AFileName);
  2909. if sFile = '' then
  2910. Exit;
  2911. if not FileExists(sFile) then
  2912. Exit;
  2913. // 只处理文件类型为1的文件
  2914. if IsSmartCostProjectFile(sFile) then
  2915. begin
  2916. smbFileHead := ReadScFileHead(sFile);
  2917. smbFileHead.SourceFileName := EncryptStringByMD5(CreateClassID);
  2918. try
  2919. smbFile := TFileStream.Create(sFile, fmOpenWrite);
  2920. smbFile.Position := 0;
  2921. smbFile.Write(smbFileHead, SizeOf(smbFileHead));
  2922. finally
  2923. smbFile.Free;
  2924. end;
  2925. end;
  2926. end;
  2927. function TScfrmBigProjManage.GetFileGUID(AFileName: string): string;
  2928. var
  2929. sFile: string;
  2930. smbFileHead: TScFileHead;
  2931. begin
  2932. Result := '';
  2933. sFile := Trim(AFileName);
  2934. smbFileHead := ReadScFileHead(sFile);
  2935. if Trim(smbFileHead.SourceFileName) <> '' then
  2936. Result := smbFileHead.SourceFileName
  2937. else
  2938. MessageWarning('文件标识符异常!请联系客服。');
  2939. end;
  2940. procedure TScfrmBigProjManage.SetExportedStaticBillsFlag(
  2941. AFileName: string; AIsExported: Integer);
  2942. var
  2943. sFile: string;
  2944. smbFileHead: TScFileHead;
  2945. smbFile: TFileStream;
  2946. begin
  2947. sFile := Trim(AFileName);
  2948. if sFile = '' then
  2949. Exit;
  2950. if not FileExists(sFile) then
  2951. Exit;
  2952. smbFileHead := ReadScFileHead(sFile);
  2953. smbFileHead.ExportedStaticBills := 1;
  2954. try
  2955. smbFile := TFileStream.Create(sFile, fmOpenWrite);
  2956. smbFile.Position := 0;
  2957. smbFile.Write(smbFileHead, SizeOf(smbFileHead));
  2958. finally
  2959. smbFile.Free;
  2960. end;
  2961. end;
  2962. function TScfrmBigProjManage.IsFileHadExportedStaticBills(
  2963. AFileName: string): Boolean;
  2964. var
  2965. sFile: string;
  2966. smbFileHead: TScFileHead;
  2967. begin
  2968. Result := False;
  2969. sFile := Trim(AFileName);
  2970. if sFile = '' then
  2971. Exit;
  2972. if not FileExists(sFile) then
  2973. Exit;
  2974. smbFileHead := ReadScFileHead(sFile);
  2975. Result := smbFileHead.ExportedStaticBills = 1;
  2976. end;
  2977. procedure TScfrmBigProjManage.zgPropertiesMouseDown(Sender: TObject;
  2978. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  2979. var
  2980. iRoadLong: Double;
  2981. begin
  2982. // 固化清单
  2983. // 根据起止桩号自动计算路长, 单击到路长单元格的时候才会自动计算
  2984. with zgProperties do
  2985. begin
  2986. if CurCol <> 1 then
  2987. Exit;
  2988. if SameText(Cells[CurCol-1, CurRow].Text, '路线或桥梁长度(km)') then
  2989. begin
  2990. iRoadLong := GetDistanceByRoadSign(zgProperties.Cells[CurCol, CurRow-2].Text, zgProperties.Cells[CurCol, CurRow-1].Text, 'k', '+');
  2991. if iRoadLong = 0 then
  2992. Exit;
  2993. zgProperties.Cells[CurCol, CurRow].Text := FloatToStr(iRoadLong);
  2994. end;
  2995. end;
  2996. end;
  2997. procedure TScfrmBigProjManage.zgPropertiesKeyDown(Sender: TObject;
  2998. var Key: Word; Shift: TShiftState);
  2999. var
  3000. iRoadLong: Double;
  3001. begin
  3002. if Key = VK_RETURN then
  3003. begin
  3004. // 固化清单
  3005. // 根据起止桩号自动计算路长, 单击到路长单元格的时候才会自动计算
  3006. with zgProperties do
  3007. begin
  3008. if CurCol <> 1 then
  3009. Exit;
  3010. if SameText(Cells[CurCol-1, CurRow].Text, '终点桩号') then
  3011. begin
  3012. iRoadLong := GetDistanceByRoadSign(zgProperties.Cells[CurCol, CurRow-1].Text, zgProperties.Cells[CurCol, CurRow].Text, 'k', '+');
  3013. if iRoadLong = 0 then
  3014. Exit;
  3015. zgProperties.Cells[CurCol, CurRow+1].Text := FloatToStr(iRoadLong);
  3016. end;
  3017. end;
  3018. end;
  3019. end;
  3020. procedure TScfrmBigProjManage.zgBuildProjectsCellTextChanging(
  3021. Sender: TObject; const ACoord: TPoint; var NewValue: String;
  3022. var Accept: Boolean);
  3023. var
  3024. I: Integer;
  3025. Ch: Char;
  3026. begin
  3027. if _IsFixedBills then
  3028. begin
  3029. if not MessageQuest('修改建设项目名称,先前导出的固化清单将作废!' + #13#10 + '您是否要继续?') then
  3030. begin
  3031. Accept := False;
  3032. Exit;
  3033. end;
  3034. end;
  3035. NewValue := Trim(NewValue);
  3036. for I := 1 to Length(NewValue) do
  3037. begin
  3038. Ch := NewValue[I];
  3039. if not ValidFileName(Ch) then
  3040. begin
  3041. HintInvalidFileName;
  3042. Accept := False;
  3043. Break;
  3044. end;
  3045. end;
  3046. end;
  3047. procedure TScfrmBigProjManage.ImportXML_KM;
  3048. var vXMLDoc: IXMLDocument;
  3049. vRoot, vNode: IXMLNode;
  3050. ODlg: TOpenDialog;
  3051. sFile, sProjName, sBName: string;
  3052. vProjItem: TScProjManagerTreeNode;
  3053. vPort: TkmXMLPort;
  3054. Rec: TsdDataRecord;
  3055. begin
  3056. ODlg := TOpenDialog.Create(nil);
  3057. vXMLDoc := TXMLDocument.Create(nil);
  3058. vXMLDoc.Active := True;
  3059. try
  3060. ODlg.InitialDir := ExtractFilePath(Application.ExeName) + 'UserData\';
  3061. // ODlg.Filter := '数据交换规范文件(*.YGLT、*.YGLZ)|*.YGLT;*.YGLZ';
  3062. ODlg.Filter := '数据交换规范文件(*.YGLZ)|*.YGLZ';
  3063. if ODlg.Execute then
  3064. sFile := ODlg.FileName
  3065. else
  3066. Exit;
  3067. vXMLDoc.Options := vXMLDoc.Options + [doNodeAutoIndent];
  3068. vXMLDoc.Version := '1.0';
  3069. vXMLDoc.Encoding := 'UTF-8';
  3070. vXMLDoc.LoadFromFile(sFile);
  3071. vRoot := vXMLDoc.DocumentElement;
  3072. sProjName := vRoot.Attributes['Name'];
  3073. vNode := vRoot.ChildNodes.FindNode('SingleProject');
  3074. vNode := vNode.ChildNodes.FindNode('UnitProject');
  3075. sBName := vNode.Attributes['Name'];
  3076. // 建设项目
  3077. vProjItem := FManageProjects.FindBuildProjectWithFull(sProjName);
  3078. if not Assigned(vProjItem) then
  3079. vProjItem := FManageProjects.AddBuildProjectWithFull(sProjName);
  3080. FManageProjects.LocateBuildProject(vProjItem.ID);
  3081. // 标段
  3082. Rec := ProjectManager.TendersRec(vProjItem.ID, sBName);
  3083. if Assigned(Rec) then
  3084. begin
  3085. MessageHint(0, '已存在同名的项目!');
  3086. Exit;
  3087. end;
  3088. TScMainForm(Application.MainForm).OpenFileByXML(sBName,
  3089. vProjItem.ID, oftNew);
  3090. RefreshInfoView;
  3091. vPort := TkmXMLPort.Create;
  3092. vPort.Project := TScProjForm(ScMainForm.ActiveMDIChild).Project;
  3093. vPort.XMLFile := sFile;
  3094. vPort.LoadFromXML;
  3095. finally
  3096. vXMLDoc.ChildNodes.Clear;
  3097. vXMLDoc.Active := False;
  3098. ODlg.Free;
  3099. vPort.Free;
  3100. end;
  3101. end;
  3102. procedure TScfrmBigProjManage.ImportXML_QG;
  3103. var
  3104. ODlg: TOpenDialog;
  3105. strFile: string;
  3106. begin
  3107. ODlg := TOpenDialog.Create(nil);
  3108. try
  3109. // ODlg.InitialDir := ExtractFilePath(Application.ExeName) + 'UserData\';
  3110. // ODlg.Filter := '数据交换规范文件(*.YGLT、*.YGLZ)|*.YGLT;*.YGLZ';
  3111. ODlg.Filter := '全国造价数据标准文件(*.XML)|*.XML';
  3112. if ODlg.Execute then
  3113. strFile := ODlg.FileName
  3114. else
  3115. Exit;
  3116. finally
  3117. ODlg.Free;
  3118. end;
  3119. if strFile <> '' then
  3120. ScXMLToBuildProject.ImportXML_QuanGuo(strFile, '');
  3121. end;
  3122. procedure TScfrmBigProjManage.zgBuildProjectsPaste(Sender: TObject;
  3123. const ABounds: TRect; var Allow: Boolean);
  3124. begin
  3125. Allow := False;
  3126. end;
  3127. procedure TScfrmBigProjManage.zgRelaFilesPaste(Sender: TObject;
  3128. const ABounds: TRect; var Allow: Boolean);
  3129. begin
  3130. Allow := False;
  3131. end;
  3132. procedure TScfrmBigProjManage.zgPropertiesCellTextChanging(Sender: TObject;
  3133. const ACoord: TPoint; var NewValue: String; var Accept: Boolean);
  3134. begin
  3135. if ACoord.X = 1 then
  3136. case ACoord.Y of
  3137. {$IFDEF _ScNoFeeRate}8{$ELSE}10{$ENDIF}:
  3138. begin
  3139. if Trim(NewValue) = '' then
  3140. Accept := False;
  3141. end;
  3142. end;
  3143. end;
  3144. procedure TScfrmBigProjManage.edtFindBPChange(Sender: TObject);
  3145. begin
  3146. SearchBuildProject(Trim(edtFindBP.Text));
  3147. end;
  3148. procedure TScfrmBigProjManage.SearchBuildProject(AProjectName: string; AFromHead: Boolean);
  3149. function SearchFrom(ANode: TsdIDTreeNode): TsdIDTreeNode;
  3150. var
  3151. vCur: TsdIDTreeNode;
  3152. begin
  3153. Result := nil;
  3154. vCur := ANode;
  3155. while Assigned(vCur) and not Assigned(Result) do
  3156. begin
  3157. if (Pos(UpperCase(AProjectName), UpperCase(vCur.Rec.ValueByName('Name').AsString)) > 0) then
  3158. begin
  3159. Result := vCur;
  3160. Break;
  3161. end;
  3162. vCur := vCur.NextNode;
  3163. end;
  3164. end;
  3165. var
  3166. vNode: TsdIDTreeNode;
  3167. begin
  3168. if AProjectName = '' then Exit;
  3169. if AFromHead then
  3170. vNode := SearchFrom(staBuildProjects.IDTree.FirstNode)
  3171. else
  3172. vNode := SearchFrom(staBuildProjects.IDTree.Selected.NextNode);
  3173. if Assigned(vNode) then
  3174. begin
  3175. staBuildProjects.DataView.LocateInControl(vNode.Rec);
  3176. if not vNode.Expanded then
  3177. vNode.Expand;
  3178. end;
  3179. end;
  3180. procedure TScfrmBigProjManage.btnFindNextClick(Sender: TObject);
  3181. begin
  3182. SearchBuildProject(Trim(edtFindBP.Text), False);
  3183. end;
  3184. function TScfrmBigProjManage.VerifySBP(ABuildProject, AFileName: string): Boolean;
  3185. var
  3186. Importer: TScBuildProjectSaver;
  3187. strFile, strOldVer, strNewVer: string;
  3188. I: Integer;
  3189. iFileType: Integer;
  3190. bpNode: TScProjManagerTreeNode;
  3191. TenderRec: TsdDataRecord;
  3192. slstProj: TStringList;
  3193. begin
  3194. Result := False;
  3195. Importer := TScBuildProjectSaver.Create;
  3196. try
  3197. // 版本信息异常,退出
  3198. if not Importer.CanImport(AFileName, strOldVer, strNewVer) then
  3199. Exit;
  3200. if Importer.OpenProject(AFileName) then
  3201. begin
  3202. bpNode := FManageProjects.FindBuildProjectWithFull(ABuildProject);
  3203. // 未找到对应建设项目,退出
  3204. if bpNode = nil then
  3205. Exit;
  3206. Screen.Cursor := crHourGlass;
  3207. try
  3208. Importer.ImportProject(ExtractFileNameWithoutExt(AFileName));
  3209. finally
  3210. Screen.Cursor := crDefault;
  3211. end;
  3212. end;
  3213. slstProj := TStringList.Create;
  3214. try
  3215. for I := 0 to Importer.FileList.Count - 1 do
  3216. begin
  3217. strFile := Importer.FileList[I];
  3218. if not IsSmartCostFile(strFile) > 0 then Continue;
  3219. iFileType := GetFileType(strFile);
  3220. // 暂时只校验项目文件
  3221. case iFileType of
  3222. FileType_Project, FileType_StaticBills:
  3223. begin
  3224. TenderRec := ProjectManager.TendersRec(bpNode.ID, ExtractFileNameWithoutExt(strFile));
  3225. if not SameFile(strFile, TenderRec.ValueByName('FileName').AsString) then
  3226. Exit;
  3227. end;
  3228. else
  3229. Continue;
  3230. end;
  3231. end;
  3232. finally
  3233. slstProj.Free;
  3234. end;
  3235. Result := True;
  3236. finally
  3237. Importer.Free;
  3238. end;
  3239. end;
  3240. function TScfrmBigProjManage.SelectedBuildProject: Boolean;
  3241. var
  3242. vNode: TScProjManagerTreeNode;
  3243. begin
  3244. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  3245. Result := Assigned(vNode) and vNode.IsBuildProj;
  3246. end;
  3247. procedure TScfrmBigProjManage.zgBuildProjectsEditorLoadCell(
  3248. Sender: TObject; ACoord: TPoint; AControl: TWinControl);
  3249. begin
  3250. if (ACoord.X = staBuildProjects.ColumnIndex('EditDate') + zgBuildProjects.FixedColCount)
  3251. and (staBuildProjects.IDTree.Selected.Rec.ValueByName('Type').AsInteger = iPM_BuildProj) then
  3252. begin
  3253. dtpEditDate.Date := ScStrToDate(zgBuildProjects.Cells[ACoord.X, ACoord.Y].Text);
  3254. end;
  3255. end;
  3256. procedure TScfrmBigProjManage.zgBuildProjectsEditorSaveCell(
  3257. Sender: TObject; ACoord: TPoint; AControl: TWinControl);
  3258. begin
  3259. if (ACoord.X = staBuildProjects.ColumnIndex('EditDate') + zgBuildProjects.FixedColCount)
  3260. and (staBuildProjects.IDTree.Selected.Rec.ValueByName('Type').AsInteger = iPM_BuildProj) then
  3261. zgBuildProjects.Cells[ACoord.X, ACoord.Y].Text := FormatDateTime('yyyy-mm-dd', dtpEditDate.Date);
  3262. end;
  3263. procedure TScfrmBigProjManage.zgBuildProjectsGetCellEditor(Sender: TObject;
  3264. ACoord: TPoint; var AControl: TWinControl);
  3265. begin
  3266. if (ACoord.X = staBuildProjects.ColumnIndex('EditDate') + zgBuildProjects.FixedColCount)
  3267. and (not TScProjManagerTreeNode(staBuildProjects.IDTree.Selected).IsFolder) then
  3268. AControl := dtpEditDate;
  3269. end;
  3270. function TScfrmBigProjManage.CurBuildProjID: Integer;
  3271. var
  3272. vNode: TScProjManagerTreeNode;
  3273. begin
  3274. Result := -1;
  3275. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  3276. if Assigned(vNode) then
  3277. begin
  3278. if vNode.IsTender then
  3279. Result := vNode.ParentID
  3280. else if (vNode.IsBuildProj) then
  3281. Result := vNode.ID;
  3282. end;
  3283. end;
  3284. procedure TScfrmBigProjManage.actnNewFolderExecute(Sender: TObject);
  3285. var
  3286. strName: string;
  3287. vParent, vFolder: TScProjManagerTreeNode;
  3288. begin
  3289. if ScInputQuery('新建文件夹', '请输入文件夹名称', strName, False, True) then
  3290. begin
  3291. strName := Trim(strName);
  3292. if strName = '' then
  3293. begin
  3294. MessageHint('文件夹名称不可为空。');
  3295. Exit;
  3296. end;
  3297. vParent := nil;
  3298. if Assigned(staBuildProjects.IDTree.Selected) then
  3299. vParent := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected.Parent);
  3300. if not Assigned(vParent) or vParent.IsFolder then
  3301. begin
  3302. vFolder := FManageProjects.FindManagerNode(vParent, strName);
  3303. if vFolder <> nil then
  3304. MessageHint(0, Format('存在同名建设项目或者文件夹[%s]。', [strName]))
  3305. else
  3306. vFolder := FManageProjects.AddBuildProjectFolder(vParent, strName);
  3307. end;
  3308. end;
  3309. end;
  3310. procedure TScfrmBigProjManage.actnDelBPUpdate(Sender: TObject);
  3311. begin
  3312. TAction(Sender).Enabled := TScMainForm(Application.MainForm).IsManageView
  3313. end;
  3314. procedure TScfrmBigProjManage.actnOpenHistoryDirExecute(Sender: TObject);
  3315. var
  3316. vTender: TScProjManagerTreeNode;
  3317. sDir: string;
  3318. begin
  3319. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  3320. if not Assigned(vTender) then
  3321. raise Exception.Create('请选中需要查看备份文件的标段。');
  3322. if not vTender.IsTender then
  3323. raise Exception.Create('仅标段可查看备份文件。');
  3324. sDir := FixPathByAppPath('Pro_BackUp\BackUpFiles\' + ExtractFileName(vTender.Rec.FileName.AsString));
  3325. if DirectoryExists(sDir) then
  3326. ShellExecute(Handle, 'open', 'Explorer.exe', PChar(sDir), nil, 1)
  3327. else
  3328. MessageWarning('当前项目无备份数据。');
  3329. end;
  3330. procedure TScfrmBigProjManage.RefreshProjectView(ABuildProjectID: Integer);
  3331. var
  3332. ViewNode, ChildNode: TZjTreeNode;
  3333. I, iRow, iID: Integer;
  3334. strFile: string;
  3335. bNeedContinue: Boolean;
  3336. strFilter: string;
  3337. iProgressiveType, iSiteConstructType: TGatherMode;
  3338. begin
  3339. if ABuildProjectID = -1 then
  3340. ABuildProjectID := CurBuildProjID;
  3341. //InitViews;
  3342. if FManageProjects = nil then
  3343. Exit;
  3344. FManageProjects.SyncCurRelaFiles(ABuildProjectID);
  3345. with FManageProjects do
  3346. begin
  3347. // 费率文件 // 单价文件 // 定额库
  3348. FIsLoading := True;
  3349. ClearRelaFilesView;
  3350. cdsRelaFiles.Open;
  3351. cdsRelaFiles.Filtered := False;
  3352. cdsRelaFiles.Filter := 'BuildProjectID = ' + IntToStr(ABuildProjectID);
  3353. cdsRelaFiles.Filtered := True;
  3354. try
  3355. cdsRelaFiles.First;
  3356. while not cdsRelaFiles.Eof do
  3357. begin
  3358. bNeedContinue := False;
  3359. case cdsRelaFilesFileType.Value of
  3360. FileType_RationLib:
  3361. begin
  3362. for I := 0 to FRationParent.ChildCount - 1 do
  3363. begin
  3364. ChildNode := FRationParent.ChildNodes[I];
  3365. strFile := VarToStr(FManageProjects.cdsRelaFiles.Lookup('ID', Integer(ChildNode.Data), 'FileName'));
  3366. if (strFile = '') or SameText(strFile, cdsRelaFilesFileName.Value) then
  3367. begin
  3368. bNeedContinue := True;
  3369. Break;
  3370. end;
  3371. end;
  3372. if bNeedContinue then
  3373. begin
  3374. cdsRelaFiles.Next;
  3375. Continue;
  3376. end;
  3377. ViewNode := FRationParent.AddChild;
  3378. ViewNode.Caption[1] := NewRelaFileDisplayName(cdsRelaFilesName.AsString); //ExtractFileNameWithoutExt(cdsRelaFilesFileName.Value);
  3379. ViewNode.Data := Pointer(cdsRelaFilesID.Value);
  3380. end;
  3381. FileType_FeeFile:
  3382. begin
  3383. {$IFNDEF _ScNoFeeRate}
  3384. for I := 0 to FFeeParent.ChildCount - 1 do
  3385. begin
  3386. ChildNode := FFeeParent.ChildNodes[I];
  3387. strFile := VarToStr(FManageProjects.cdsRelaFiles.Lookup('ID', Integer(ChildNode.Data), 'FileName'));
  3388. if (strFile = '') or SameText(strFile, cdsRelaFilesFileName.Value) then
  3389. begin
  3390. bNeedContinue := True;
  3391. Break;
  3392. end;
  3393. end;
  3394. if bNeedContinue then
  3395. begin
  3396. cdsRelaFiles.Next;
  3397. Continue;
  3398. end;
  3399. ViewNode := FFeeParent.AddChild;
  3400. ViewNode.Caption[1] := NewRelaFileDisplayName(cdsRelaFilesName.AsString); //ExtractFileNameWithoutExt(cdsRelaFilesFileName.Value);
  3401. ViewNode.Data := Pointer(cdsRelaFilesID.Value);
  3402. {$ENDIF}
  3403. end;
  3404. FileType_PriceFile:
  3405. begin
  3406. for I := 0 to FPriceParent.ChildCount - 1 do
  3407. begin
  3408. ChildNode := FPriceParent.ChildNodes[I];
  3409. strFile := VarToStr(FManageProjects.cdsRelaFiles.Lookup('ID', Integer(ChildNode.Data), 'FileName'));
  3410. if (strFile = '') or SameText(strFile, cdsRelaFilesFileName.Value) then
  3411. begin
  3412. bNeedContinue := True;
  3413. Break;
  3414. end;
  3415. end;
  3416. if bNeedContinue then
  3417. begin
  3418. cdsRelaFiles.Next;
  3419. Continue;
  3420. end;
  3421. ViewNode := FPriceParent.AddChild;
  3422. ViewNode.Caption[1] := NewRelaFileDisplayName(cdsRelaFilesName.AsString); //ExtractFileNameWithoutExt(cdsRelaFilesFileName.Value);
  3423. ViewNode.Data := Pointer(cdsRelaFilesID.Value);
  3424. end;
  3425. end;
  3426. cdsRelaFiles.Next;
  3427. end;
  3428. finally
  3429. cdsRelaFiles.Filtered := False;
  3430. FIsLoading := False;
  3431. end;
  3432. end;
  3433. if FFeeParent.ChildCount > 0 then
  3434. zgRelaFiles.Selection.Bounds := Rect(2, 2, 2, 2)
  3435. else
  3436. zgRelaFiles.Selection.Bounds := Rect(2, 1, 2, 1);
  3437. zgRelaFiles.TopLeftCoord := Point(1, 1);
  3438. if staBuildProjects.IDTree.Selected <> nil then
  3439. begin
  3440. if TScProjManagerTreeNode(staBuildProjects.IDTree.Selected).IsBuildProj then
  3441. begin
  3442. jpcPropties.ActivePage := jpcProptiesBuildProject;
  3443. jpcBuildProjectProperties.ActivePage := jpcBuildProjectPropertiesRelaFiles;
  3444. pnlFiles.Visible := True;
  3445. RefreshBuildProjectPropertyView(ABuildProjectID);
  3446. end
  3447. else if TScProjManagerTreeNode(staBuildProjects.IDTree.Selected).IsTender then
  3448. begin
  3449. jpcPropties.ActivePage := jpcProptiesTender;
  3450. pnlFiles.Visible := True;
  3451. end
  3452. else
  3453. pnlFiles.Visible := False;
  3454. end
  3455. else
  3456. pnlFiles.Visible := False;
  3457. iProgressiveType := ProjectManager.GetProgressiveType(ABuildProjectID);
  3458. case iProgressiveType of
  3459. gmAdd: cbbGatherOtherFee.ItemIndex := 1;
  3460. gmCalculate: cbbGatherOtherFee.ItemIndex := 0;
  3461. else
  3462. cbbGatherOtherFee.ItemIndex := -1;
  3463. end;
  3464. cbbProgressiveFile.ItemIndex := -1;
  3465. iSiteConstructType := ProjectManager.GetSiteConstructType(ABuildProjectID);
  3466. case iSiteConstructType of
  3467. gmAdd: cbbSiteConstructType.ItemIndex := 1;
  3468. gmCalculate: cbbSiteConstructType.ItemIndex := 0;
  3469. else
  3470. cbbSiteConstructType.ItemIndex := -1;
  3471. end;
  3472. cbbProgressiveFile.ItemIndex := -1;
  3473. iID := ProjectManager.GetProgressiveFileID(ABuildProjectID);
  3474. for I := 0 to cbbProgressiveFile.Items.Count - 1 do
  3475. begin
  3476. if iID = Integer(cbbProgressiveFile.Items.Objects[I]) then
  3477. begin
  3478. cbbProgressiveFile.ItemIndex := I;
  3479. Break;
  3480. end;
  3481. end;
  3482. edtGatherCoe.OnChange := nil;
  3483. try
  3484. edtGatherCoe.Text := FloatToStr(ProjectManager.GetProgressiveCoe(ABuildProjectID));
  3485. finally
  3486. edtGatherCoe.OnChange := edtGatherCoeChange;
  3487. end;
  3488. end;
  3489. function TScfrmBigProjManage.GetCurrentFullBuildProjectName: string;
  3490. begin
  3491. Result := ProjectManager.CompleteBuildProjName(CurBuildProjID);
  3492. end;
  3493. procedure TScfrmBigProjManage.zgBuildProjectsCellCanEdit(Sender: TObject;
  3494. const ACoord: TPoint; var Allow: Boolean);
  3495. var
  3496. vNode: TScProjManagerTreeNode;
  3497. X: Integer;
  3498. begin
  3499. X := ACoord.X - zgBuildProjects.FixedColCount;
  3500. if (X = staBuildProjects.ColumnIndex('Author')) or
  3501. (X = staBuildProjects.ColumnIndex('Auditor')) or
  3502. (X = staBuildProjects.ColumnIndex('Principal')) or
  3503. (X = staBuildProjects.ColumnIndex('EditDate')) then
  3504. begin
  3505. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Items[ACoord.Y - zgBuildProjects.FixedRowCount]);
  3506. Allow := vNode.IsBuildProj;
  3507. end;
  3508. end;
  3509. procedure TScfrmBigProjManage.zgBuildProjectsShowHint(var HintStr: String;
  3510. var CanShow: Boolean; var HintInfo: THintInfo; const ACoord: TPoint);
  3511. var
  3512. vCell: TZjCell;
  3513. vNode: TsdIDTreeNode;
  3514. iLevelWidth: Integer;
  3515. rText: TRect;
  3516. procedure CalcTextRect(var R: TRect);
  3517. var
  3518. DC: HDC;
  3519. iTextHeight: Integer;
  3520. begin
  3521. DC := CreateCompatibleDC(0);
  3522. try
  3523. SelectObject(DC, vCell.Font.Handle);
  3524. iTextHeight := DrawText(DC, PChar(vCell.Text), Length(vCell.Text), R, DT_SINGLELINE or DT_VCenter
  3525. or DT_NOCLIP or DT_CALCRECT);
  3526. finally
  3527. DeleteDC(DC);
  3528. end;
  3529. end;
  3530. begin
  3531. if (ACoord.Y < 1) and (ACoord.X <> 1) then Exit;
  3532. vCell := zgBuildProjects.Cells[ACoord.X, ACoord.Y];
  3533. with HintInfo do
  3534. begin
  3535. vNode := staBuildProjects.IDTree.Items[ACoord.Y - 1];
  3536. if not Assigned(vNode) then Exit;
  3537. iLevelWidth := (vNode.Level + 1) * 20 + 16;
  3538. rText := CursorRect;
  3539. CalcTextRect(rText);
  3540. if (rText.Right - rText.Left + iLevelWidth > CursorRect.Right - CursorRect.Left) or
  3541. (rText.Right > ClientWidth) then
  3542. begin
  3543. CanShow := True;
  3544. HintStr := vCell.Text;
  3545. GetCursorPos(HintPos);
  3546. end;
  3547. end;
  3548. end;
  3549. procedure TScfrmBigProjManage.actnNewSubFolderExecute(Sender: TObject);
  3550. var
  3551. strName: string;
  3552. vParent, vFolder: TScProjManagerTreeNode;
  3553. begin
  3554. if ScInputQuery('新建文件夹', '请输入文件夹名称', strName, False, True) then
  3555. begin
  3556. strName := Trim(strName);
  3557. if strName = '' then
  3558. begin
  3559. MessageHint('文件夹名称不可为空。');
  3560. Exit;
  3561. end;
  3562. vParent := nil;
  3563. if Assigned(staBuildProjects.IDTree.Selected) then
  3564. vParent := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  3565. vFolder := FManageProjects.FindManagerNode(vParent, strName);
  3566. if vFolder <> nil then
  3567. MessageHint(0, Format('存在同名建设项目或者文件夹[%s]。', [strName]))
  3568. else
  3569. vFolder := FManageProjects.AddBuildProjectFolder(vParent, strName);
  3570. end;
  3571. end;
  3572. procedure TScfrmBigProjManage.actnNewSubFolderUpdate(Sender: TObject);
  3573. var
  3574. vNode: TScProjManagerTreeNode;
  3575. begin
  3576. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  3577. TAction(Sender).Enabled := TScMainForm(Application.MainForm).IsManageView
  3578. and Assigned(vNode) and vNode.IsFolder;
  3579. end;
  3580. procedure TScfrmBigProjManage.SetShowFiles(const Value: Boolean);
  3581. begin
  3582. pnlFiles.Visible := Value;
  3583. Splitter1.Visible := Value;
  3584. end;
  3585. function TScfrmBigProjManage.GetShowFiles: Boolean;
  3586. begin
  3587. Result := pnlFiles.Visible;
  3588. end;
  3589. procedure TScfrmBigProjManage.zgBuildProjectsMouseDown(Sender: TObject;
  3590. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  3591. var
  3592. vNode: TScProjManagerTreeNode;
  3593. begin
  3594. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  3595. if (zgBuildProjects.CurCol = 1) and (ssDouble in Shift) and (Button = mbLeft) and Assigned(vNode) and vNode.IsTender then
  3596. begin
  3597. {$IFDEF _ScExportOnly}
  3598. MessageHint('请使用软件锁版本,该版本无法打开项目。');
  3599. {$ELSE}
  3600. TScMainForm(Application.MainForm).OpenFile(vNode.Rec.FileName.AsString);
  3601. {$ENDIF}
  3602. end;
  3603. if (zgBuildProjects.CurCol = 1) and
  3604. (Button = mbRight) and (ssCtrl in Shift) and (ssAlt in Shift) and (ssShift in Shift)
  3605. and Assigned(vNode) and vNode.IsTender then
  3606. ExportCurrentProjectFile(False);
  3607. end;
  3608. procedure TScfrmBigProjManage.actnNewFolderUpdate(Sender: TObject);
  3609. var
  3610. vNode: TScProjManagerTreeNode;
  3611. begin
  3612. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  3613. TAction(Sender).Enabled := TScMainForm(Application.MainForm).IsManageView
  3614. and (not(Assigned(vNode) and vNode.IsTender));
  3615. end;
  3616. procedure TScfrmBigProjManage.zgBuildProjectsCellGetColor(Sender: TObject;
  3617. ACoord: TPoint; var AColor: TColor);
  3618. begin
  3619. if (ACoord.Y = zgBuildProjects.CurRow) and Assigned(staBuildProjects.DataView.Current) and
  3620. IsStaticBillsFile(staBuildProjects.DataView.Current.ValueByName(SFileName).AsString) then
  3621. AColor := $66CC99;
  3622. end;
  3623. procedure TScfrmBigProjManage.actnExportUpdate(Sender: TObject);
  3624. var
  3625. vNode: TScProjManagerTreeNode;
  3626. begin
  3627. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  3628. TAction(Sender).Enabled := TScMainForm(Application.MainForm).IsManageView
  3629. and Assigned(vNode) and (not vNode.IsFolder);
  3630. end;
  3631. procedure TScfrmBigProjManage.actnExportExecute(Sender: TObject);
  3632. procedure ExportBuildProject;
  3633. var
  3634. strFile, sPath, sFullFile, sN: string;
  3635. begin
  3636. sdExport.Filter := GetDialogExtString(dtBuildProject);
  3637. strFile := GetCurrentBPName;
  3638. sFullFile := '';
  3639. FixFileExt(strFile, SBuildProjectFileExt);
  3640. // 配置文件中的OutputPath有时是绝对路径有时是相对路径, 悲剧啊
  3641. // OutputPath=D:\Program Files\纵横软件\广东公路造价编审系统(标准化2011)网络版\导出文件\
  3642. // OutputPath=导出文件\
  3643. // if Pos(':\', ConfigInfo.OutputPath) > 0 then
  3644. // sPath := ConfigInfo.OutputPath
  3645. // else
  3646. // sPath := ExtractFilePath(Application.ExeName) + ConfigInfo.OutputPath;
  3647. sPath := GetCurrentDir + '\';
  3648. // 是程序目录则定位到导出文件目录
  3649. if SameText(sPath, AppPath) then
  3650. begin
  3651. if Pos(':\', ConfigInfo.OutputPath) > 0 then
  3652. sPath := ConfigInfo.OutputPath
  3653. else
  3654. sPath := AppPath + ConfigInfo.OutputPath;
  3655. end;
  3656. sFullFile := sPath + strFile;
  3657. // 检查长度,超过255字符处理为“导出文件”路径
  3658. if Length(sFullFile) > 255 then
  3659. begin
  3660. if Pos(':\', ConfigInfo.OutputPath) > 0 then
  3661. sPath := ConfigInfo.OutputPath
  3662. else
  3663. sPath := AppPath + ConfigInfo.OutputPath;
  3664. sFullFile := sPath + strFile;
  3665. end;
  3666. if not DirectoryExists(sPath) then
  3667. ForceDirectories(sPath);
  3668. sdExport.FileName := sFullFile;
  3669. if sdExport.Execute then
  3670. begin
  3671. sN := ExtractFileName(sdExport.FileName);
  3672. strFile := sdExport.FileName;
  3673. if HasSpecChars(sN) then
  3674. begin
  3675. Application.MessageBox('保存失败:文件名中包含特殊字符,请重试!', '系统提醒', MB_OK + MB_ICONWARNING);
  3676. Exit;
  3677. end;
  3678. FixFileExt(strFile, SBuildProjectFileExt);
  3679. // 检查长度,超过255字符提示
  3680. if Length(strFile) > 255 then
  3681. begin
  3682. SetCurrentDir(sPath);
  3683. MessageHint('导出文件路径太长,超过系统限制。请重新选择完整路径较短的文件夹。');
  3684. Exit;
  3685. end;
  3686. ExportCurBuildProject(strFile);
  3687. if not VerifySBP(GetCurrentFullBuildProjectName, strFile) then
  3688. begin
  3689. ExportCurBuildProject(strFile);
  3690. if not VerifySBP(GetCurrentFullBuildProjectName, strFile) then
  3691. raise EManageProjects.Create('导出文件出现错误,请更换导出位置再次尝试。如仍然失败请联系纵横客服。');
  3692. end;
  3693. end;
  3694. end;
  3695. procedure ExportTender;
  3696. var
  3697. vTender, vBuildProj: TScProjManagerTreeNode;
  3698. bIsBills, bIsFixed: Boolean;
  3699. strFile, strAlias, strBPName, strBPFullName, strSourceFile, sPath, strExt, sFullFile: string;
  3700. begin
  3701. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  3702. if Assigned(vTender) then
  3703. vBuildProj := TScProjManagerTreeNode(vTender.Parent)
  3704. else
  3705. vBuildProj := nil;
  3706. if not Assigned(vTender) or not vTender.IsTender then Exit;
  3707. if not Assigned(vBuildProj) or not vBuildProj.IsBuildProj then Exit;
  3708. strAlias := vTender.Rec.Name.AsString;
  3709. strSourceFile := vTender.Rec.FileName.AsString;
  3710. strFile := strAlias;
  3711. strBPName := vBuildProj.Rec.Name.AsString;
  3712. strBPFullName := ProjectManager.CompleteBuildProjName(vBuildProj.ID);
  3713. bIsBills := IsSmartCostBillsFile(strSourceFile);
  3714. bIsFixed := IsStaticBillsFile(strSourceFile);
  3715. // 固化清单因以前概念不清和设计缺陷(固化清单本应从属于招投标,但现在无论是标段类型还是文件头,固化清单都和招投标、概预算同级),
  3716. // 文件头分不开招投标和概预算,现全部当作招投标导出。
  3717. if bIsBills or bIsFixed then
  3718. begin
  3719. sdExport.Filter := GetDialogExtString(dtBillsX);
  3720. strExt := SBillsFileXExt;
  3721. end
  3722. else
  3723. begin
  3724. sdExport.Filter := GetDialogExtString(dtBudgetX);
  3725. strExt := SBudgetFileXExt;
  3726. end;
  3727. FixFileExt(strFile, strExt);
  3728. // if Pos(':\', ConfigInfo.OutputPath) > 0 then
  3729. // sPath := ConfigInfo.OutputPath
  3730. // else
  3731. // sPath := ExtractFilePath(Application.ExeName) + ConfigInfo.OutputPath;
  3732. //
  3733. // sPath := sPath + strBPName + '\';
  3734. sPath := GetCurrentDir + '\';
  3735. // 是程序目录则定位到导出文件\建设项目目录
  3736. if SameText(sPath, AppPath) then
  3737. begin
  3738. if Pos(':\', ConfigInfo.OutputPath) > 0 then
  3739. sPath := ConfigInfo.OutputPath
  3740. else
  3741. sPath := AppPath + ConfigInfo.OutputPath;
  3742. sPath := sPath + strBPName + '\';
  3743. end;
  3744. sFullFile := sPath + strFile;
  3745. // 检查长度,超过255字符处理为“导出文件”路径
  3746. if Length(sFullFile) > 255 then
  3747. begin
  3748. if Pos(':\', ConfigInfo.OutputPath) > 0 then
  3749. sPath := ConfigInfo.OutputPath
  3750. else
  3751. sPath := AppPath + ConfigInfo.OutputPath;
  3752. sFullFile := sPath + strFile;
  3753. end;
  3754. if not DirectoryExists(sPath) then
  3755. ForceDirectories(sPath);
  3756. sdExport.FileName := sFullFile;
  3757. if sdExport.Execute then
  3758. begin
  3759. strFile := sdExport.FileName;
  3760. FixFileExt(strFile, strExt);
  3761. // 检查长度,超过255字符提示
  3762. if Length(sdExport.FileName) > 255 then
  3763. begin
  3764. // 恢复原当前路径
  3765. SetCurrentDir(sPath);
  3766. MessageHint('导出文件路径太长,超过系统限制。请重新选择完整路径较短的文件夹。');
  3767. Exit;
  3768. end;
  3769. ExportBudgetProject(vTender.ID, strBPName, strAlias, strSourceFile, strFile);
  3770. if not VerifySBP(strBPFullName, strFile) then
  3771. begin
  3772. ExportBudgetProject(vTender.ID, strBPName, strAlias, strSourceFile, strFile);
  3773. if not VerifySBP(strBPFullName, strFile) then
  3774. raise EManageProjects.Create('导出文件出现错误,请更换导出位置再次尝试。如仍然失败请联系纵横客服。');
  3775. end;
  3776. end;
  3777. end;
  3778. var
  3779. vNode: TScProjManagerTreeNode;
  3780. begin
  3781. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  3782. if vNode.IsBuildProj then
  3783. begin
  3784. // 网络版超过20个建设项目则禁止导入导出建设项目
  3785. // {$IF DEFINED(_ScOnline) AND NOT DEFINED(_ScOnlinePro)}
  3786. // if ProjectManager.BuildProjectCount > MaxBuildProjectCountOnline then
  3787. // begin
  3788. // MessageHint(Format('您创建的建设项目已超%d个,请联系我们客服人员,服务热线:0756-3850888。', [MaxBuildProjectCountOnline]));
  3789. // Exit;
  3790. // end;
  3791. // {$IFEND}
  3792. ExportBuildProject;
  3793. end
  3794. else if vNode.IsTender then
  3795. ExportTender
  3796. else
  3797. raise Exception.Create('当前选中节点,非建设项目或标段,不支持导出。');
  3798. end;
  3799. procedure TScfrmBigProjManage.RefreshInfoView;
  3800. var
  3801. vNode: TScProjManagerTreeNode;
  3802. begin
  3803. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  3804. pnlFiles.Visible := Assigned(vNode) and not vNode.IsFolder;
  3805. Splitter1.Visible := pnlFiles.Visible;
  3806. if Assigned(vNode) and vNode.IsTender then
  3807. jpcPropties.ActivePage := jpcProptiesTender
  3808. else if Assigned(vNode) and vNode.IsBuildProj then
  3809. begin
  3810. jpcPropties.ActivePage := jpcProptiesBuildProject;
  3811. jpcBuildProjectProperties.ActivePage := jpcBuildProjectPropertiesRelaFiles;
  3812. end;
  3813. if Assigned(vNode) and vNode.IsTender then
  3814. tbExport.DropdownMenu := ppmExportProject
  3815. else
  3816. tbExport.DropdownMenu := nil;
  3817. {if Assigned(vNode) and not vNode.IsFolder then
  3818. tbImport.DropdownMenu := pmImport
  3819. else
  3820. tbImport.DropdownMenu := nil;}
  3821. if Assigned(vNode) then
  3822. begin
  3823. if vNode.IsBuildProj then
  3824. RefreshProjectView(vNode.ID)
  3825. else if vNode.IsTender then
  3826. RefreshPropertyView;
  3827. end;
  3828. end;
  3829. procedure TScfrmBigProjManage.actnImportExecute(Sender: TObject);
  3830. var
  3831. I: Integer;
  3832. vNode, ProjItem: TScProjManagerTreeNode;
  3833. sFilter, sExt, sName: string;
  3834. begin
  3835. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  3836. if not Assigned(vNode) then Exit;
  3837. // 设置文件过滤
  3838. odImport.Filter := 'SmartCost文件(*' + SBuildProjectFileExt +
  3839. ';*' + SBillsFileXExt +
  3840. ';*' + SBillsFileExt +
  3841. ';*' + SBudgetFileXExt +
  3842. ';*' + SBudgetFileExt +
  3843. ';*' + SBackupFileExt +
  3844. ')|*' + SBuildProjectFileExt +
  3845. ';*' + SBillsFileXExt +
  3846. ';*' + SBillsFileExt +
  3847. ';*' + SBudgetFileXExt +
  3848. ';*' + SBudgetFileExt +
  3849. ';*' + SBackupFileExt;
  3850. // 专业版exe
  3851. // 广东招投标版要可以导入三级清单(smb)
  3852. {$IF (not Defined(_ScBills)) and (not Defined(_ScBudget)) and (not Defined(_ScGuangDong_Bills)) and (not Defined(_ScGuangDong_Budget))}
  3853. if DogIsBillsOnly then
  3854. begin
  3855. if not _IsGuangDong then
  3856. odImport.Filter := 'SmartCost文件(*' + SBuildProjectFileExt +
  3857. ';*' + SBillsFileXExt +
  3858. ';*' + SBillsFileExt +
  3859. ';*' + SBackupFileExt +
  3860. ')|*' + SBuildProjectFileExt +
  3861. ';*' + SBillsFileXExt +
  3862. ';*' + SBillsFileExt +
  3863. ';*' + SBackupFileExt
  3864. end
  3865. else if DogIsBudgetOnly then
  3866. odImport.Filter := 'SmartCost文件(*' + SBuildProjectFileExt +
  3867. ';*' + SBudgetFileXExt +
  3868. ';*' + SBudgetFileExt +
  3869. ';*' + SBackupFileExt +
  3870. ')|*' + SBuildProjectFileExt +
  3871. ';*' + SBudgetFileXExt +
  3872. ';*' + SBudgetFileExt +
  3873. ';*' + SBackupFileExt;
  3874. {$IFEND}
  3875. {$IF DEFINED(_ScBudget) OR DEFINED(_ScGuangDong_Budget)}
  3876. odImport.Filter := 'SmartCost文件(*' + SBuildProjectFileExt +
  3877. ';*' + SBudgetFileXExt +
  3878. ';*' + SBudgetFileExt +
  3879. ';*' + SBackupFileExt +
  3880. ')|*' + SBuildProjectFileExt +
  3881. ';*' + SBudgetFileXExt +
  3882. ';*' + SBudgetFileExt +
  3883. ';*' + SBackupFileExt;
  3884. {$IFEND}
  3885. {$IF DEFINED(_ScBills)}
  3886. odImport.Filter := 'SmartCost文件(*' + SBuildProjectFileExt +
  3887. ';*' + SBillsFileXExt +
  3888. ';*' + SBillsFileExt +
  3889. ';*' + SBackupFileExt +
  3890. ')|*' + SBuildProjectFileExt +
  3891. ';*' + SBillsFileXExt +
  3892. ';*' + SBillsFileExt +
  3893. ';*' + SBackupFileExt;
  3894. {$IFEND}
  3895. // 广东招投标版要可以导入三级清单(smb)
  3896. {$IF DEFINED(_ScGuangDong_Bills)}
  3897. odImport.Filter := 'SmartCost文件(*' + SBuildProjectFileExt +
  3898. ';*' + SBillsFileXExt +
  3899. ';*' + SBillsFileExt +
  3900. ';*' + SBudgetFileXExt +
  3901. ';*' + SBudgetFileExt +
  3902. ';*' + SBackupFileExt +
  3903. ')|*' + SBuildProjectFileExt +
  3904. ';*' + SBillsFileXExt +
  3905. ';*' + SBillsFileExt +
  3906. ';*' + SBudgetFileXExt +
  3907. ';*' + SBudgetFileExt +
  3908. ';*' + SBackupFileExt;
  3909. {$IFEND}
  3910. if odImport.Execute then
  3911. begin
  3912. sExt := ExtractFileExt(odImport.FileName);
  3913. if SameText(sExt, SBuildProjectFileExt) then
  3914. begin
  3915. // 网络版超过20个建设项目则禁止导入导出建设项目
  3916. // {$IF DEFINED(_ScOnline) AND NOT DEFINED(_ScOnlinePro)}
  3917. // if ProjectManager.BuildProjectCount > MaxBuildProjectCountOnline then
  3918. // begin
  3919. // MessageHint(Format('您创建的建设项目已超%d个,请联系我们客服人员,服务热线:0756-3850888。', [MaxBuildProjectCountOnline]));
  3920. // Exit;
  3921. // end;
  3922. // {$IFEND}
  3923. while vNode.IsTender do
  3924. begin
  3925. vNode := TScProjManagerTreeNode(vNode.Parent);
  3926. staBuildProjects.DataView.LocateInControl(vNode.Rec);
  3927. end;
  3928. for I := 0 to odImport.Files.Count - 1 do
  3929. ImportBP(odImport.Files[I]);
  3930. end
  3931. else
  3932. begin
  3933. sName := ExtractFileNameWithoutExt(odImport.FileName);
  3934. if vNode.IsFolder then
  3935. begin
  3936. // 网络版超过20个建设项目则禁止导入导出建设项目
  3937. // {$IF DEFINED(_ScOnline) AND NOT DEFINED(_ScOnlinePro)}
  3938. // if ProjectManager.BuildProjectCount > MaxBuildProjectCountOnline then
  3939. // begin
  3940. // MessageHint(Format('您创建的建设项目已超%d个,请联系我们客服人员,服务热线:0756-3850888。', [MaxBuildProjectCountOnline]));
  3941. // Exit;
  3942. // end;
  3943. // {$IFEND}
  3944. ProjItem := FManageProjects.FindBuildProjectWithSelect(sName);
  3945. if Assigned(ProjItem) then
  3946. begin
  3947. MessageWarning(Format('存在同名建设项目[%s],无法新建建设项目导入该分段。', [sName]));
  3948. Exit;
  3949. end
  3950. else
  3951. ProjItem := FManageProjects.AddBuildProjectWithSelect(sName, False);
  3952. staBuildProjects.DataView.LocateInControl(ProjItem.Rec);
  3953. end;
  3954. for I := 0 to odImport.Files.Count - 1 do
  3955. ImportBudgetProject(odImport.Files[I]);
  3956. end;
  3957. FManageProjects.Save;
  3958. end;
  3959. end;
  3960. procedure TScfrmBigProjManage.actnImportBPExecute(Sender: TObject);
  3961. var
  3962. i: Integer;
  3963. begin
  3964. // 网络版超过20个建设项目则禁止导入导出建设项目
  3965. // {$IF DEFINED(_ScOnline) AND NOT DEFINED(_ScOnlinePro)}
  3966. // if ProjectManager.BuildProjectCount > MaxBuildProjectCountOnline then
  3967. // begin
  3968. // MessageHint(Format('您创建的建设项目已超%d个,请联系我们客服人员,服务热线:0756-3850888。', [MaxBuildProjectCountOnline]));
  3969. // Exit;
  3970. // end;
  3971. // {$IFEND}
  3972. odImport.Filter := GetDialogExtString(dtBuildProject);
  3973. odImport.Options := odImport.Options + [ofAllowMultiSelect];
  3974. if odImport.Execute then
  3975. begin
  3976. for i := 0 to odImport.Files.Count - 1 do
  3977. begin
  3978. ImportBP(odImport.Files[i]);
  3979. end;
  3980. end;
  3981. end;
  3982. procedure TScfrmBigProjManage.actnNewTenderUpdate(Sender: TObject);
  3983. var
  3984. vNode: TScProjManagerTreeNode;
  3985. begin
  3986. {$IFDEF _ScExportOnly}
  3987. TAction(Sender).Enabled := False;
  3988. Exit;
  3989. {$ENDIF}
  3990. {$IFDEF _ScCrack}
  3991. if _IsFixedBills then
  3992. TAction(Sender).Enabled := False
  3993. else
  3994. begin
  3995. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  3996. TAction(Sender).Enabled := TScMainForm(Application.MainForm).IsManageView
  3997. and Assigned(vNode) and (not vNode.IsFolder);
  3998. end;
  3999. {$ELSE}
  4000. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4001. TAction(Sender).Enabled := TScMainForm(Application.MainForm).IsManageView
  4002. and Assigned(vNode) and (not vNode.IsFolder);
  4003. {$ENDIF}
  4004. end;
  4005. procedure TScfrmBigProjManage.actnExportBPExecute(Sender: TObject);
  4006. procedure ExportBuildProject;
  4007. var
  4008. strFile, sPath, sN: string;
  4009. begin
  4010. sdExport.Filter := GetDialogExtString(dtBuildProject);
  4011. strFile := GetCurrentBPName;
  4012. FixFileExt(strFile, SBuildProjectFileExt);
  4013. // 配置文件中的OutputPath有时是绝对路径有时是相对路径, 悲剧啊
  4014. // OutputPath=D:\Program Files\纵横软件\广东公路造价编审系统(标准化2011)网络版\导出文件\
  4015. // OutputPath=导出文件\
  4016. if Pos(':\', ConfigInfo.OutputPath) > 0 then
  4017. sPath := ConfigInfo.OutputPath
  4018. else
  4019. sPath := ExtractFilePath(Application.ExeName) + ConfigInfo.OutputPath;
  4020. strFile := sPath + strFile;
  4021. if not DirectoryExists(sPath) then
  4022. ForceDirectories(sPath);
  4023. sdExport.FileName := strFile;
  4024. if sdExport.Execute then
  4025. begin
  4026. sN := ExtractFileName(sdExport.FileName);
  4027. if HasSpecChars(sN) then
  4028. begin
  4029. Application.MessageBox('保存失败:文件名中包含特殊字符,请重试!', '系统提醒', MB_OK + MB_ICONWARNING);
  4030. Exit;
  4031. end;
  4032. ExportCurBuildProject(sdExport.FileName);
  4033. if not VerifySBP(GetCurrentFullBuildProjectName, sdExport.FileName) then
  4034. begin
  4035. ExportCurBuildProject(sdExport.FileName);
  4036. if not VerifySBP(GetCurrentFullBuildProjectName, sdExport.FileName) then
  4037. raise EManageProjects.Create('导出文件出现错误,请更换导出位置再次尝试。如仍然失败请联系纵横客服。');
  4038. end;
  4039. end;
  4040. end;
  4041. var
  4042. vNode: TScProjManagerTreeNode;
  4043. begin
  4044. // {$IF DEFINED(_ScOnline) AND NOT DEFINED(_ScOnlinePro)}
  4045. // if ProjectManager.BuildProjectCount > 20 then
  4046. // begin
  4047. // MessageHint('您创建的建设项目已超20个,请联系我们客服人员,服务热线:0756-3850888。');
  4048. // Exit;
  4049. // end;
  4050. // {$IFEND}
  4051. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4052. if vNode.IsBuildProj then
  4053. ExportBuildProject
  4054. else
  4055. raise Exception.Create('当前选中节点,非建设项目。');
  4056. end;
  4057. procedure TScfrmBigProjManage.actnExportBPUpdate(Sender: TObject);
  4058. var
  4059. vNode: TScProjManagerTreeNode;
  4060. begin
  4061. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4062. TAction(Sender).Enabled := TScMainForm(Application.MainForm).IsManageView
  4063. and Assigned(vNode) and vNode.IsBuildProj;
  4064. end;
  4065. procedure TScfrmBigProjManage.ExpandTo(AType: TBuildProjExpandType);
  4066. function CheckChildHasFolder(ANode: TScProjManagerTreeNode): Boolean;
  4067. var
  4068. i: Integer;
  4069. begin
  4070. Result := False;
  4071. if ANode.IsFolder then
  4072. begin
  4073. for i := 0 to ANode.ChildCount - 1 do
  4074. begin
  4075. if TScProjManagerTreeNode(ANode.ChildNodes[i]).IsFolder then
  4076. begin
  4077. Result := True;
  4078. Break;
  4079. end;
  4080. end;
  4081. end;
  4082. end;
  4083. function CheckChildHasBuildProj(ANode: TScProjManagerTreeNode): Boolean;
  4084. var
  4085. i: Integer;
  4086. begin
  4087. Result := False;
  4088. if ANode.IsFolder then
  4089. begin
  4090. for i := 0 to ANode.ChildCount - 1 do
  4091. begin
  4092. if TScProjManagerTreeNode(ANode.ChildNodes[i]).IsBuildProj then
  4093. begin
  4094. Result := True;
  4095. Break;
  4096. end;
  4097. end;
  4098. end;
  4099. end;
  4100. procedure ExpandToFolder;
  4101. var
  4102. i: Integer;
  4103. vNode: TScProjManagerTreeNode;
  4104. begin
  4105. for i := 0 to staBuildProjects.IDTree.Count - 1 do
  4106. begin
  4107. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Items[i]);
  4108. if vNode.IsFolder and CheckChildHasFolder(vNode) then
  4109. vNode.Expanded := True
  4110. else if vNode.HasChildren then
  4111. vNode.Expanded := False;
  4112. end;
  4113. end;
  4114. procedure ExpandToBuildProj;
  4115. var
  4116. i: Integer;
  4117. vNode: TScProjManagerTreeNode;
  4118. begin
  4119. for i := 0 to staBuildProjects.IDTree.Count - 1 do
  4120. begin
  4121. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Items[i]);
  4122. if vNode.IsFolder and CheckChildHasBuildProj(vNode) then
  4123. vNode.Expanded := True
  4124. else if vNode.HasChildren then
  4125. vNode.Expanded := False;
  4126. end;
  4127. end;
  4128. procedure ExpandAll;
  4129. begin
  4130. staBuildProjects.IDTree.ExpandLevel := 20;
  4131. end;
  4132. begin
  4133. case AType of
  4134. //bpet1, bpet2, bpet3: staBuildProjects.IDTree.ExpandLevel := Integer(AType);
  4135. bpetFolder: ExpandToFolder;
  4136. bpetBuildProj: ExpandToBuildProj;
  4137. bpetTender: ExpandAll;
  4138. end;
  4139. end;
  4140. procedure TScfrmBigProjManage.cbExpandToChange(Sender: TObject);
  4141. begin
  4142. ExpandTo(TBuildProjExpandType(cbExpandTo.ItemIndex));
  4143. ConfigInfo.BuildProjExpandLevel := cbExpandTo.ItemIndex;
  4144. end;
  4145. procedure TScfrmBigProjManage.actnEditBPNameUpdate(Sender: TObject);
  4146. begin
  4147. TAction(Sender).Enabled := TScMainForm(Application.MainForm).IsManageView and (zgBuildProjects.CurCol = 1);
  4148. end;
  4149. procedure TScfrmBigProjManage.zgPropertiesCanEditAcceptKey(var AKey: Char;
  4150. var Accept: Boolean);
  4151. const
  4152. PegCharSet: TSysCharSet = ['.', '+', '-', '0'..'9', 'A'..'Z', 'a'..'z'];
  4153. FloatCharSet: TSysCharSet = ['.', '+', '-', '0'..'9', 'E', 'e'];
  4154. begin
  4155. if zgProperties.CurCol = 1 then
  4156. begin
  4157. if zgProperties.CurRow in [18, 19] then
  4158. begin
  4159. if not (AKey in PegCharSet) then
  4160. Accept := False;
  4161. end
  4162. else if zgProperties.CurRow in [20, 21] then
  4163. begin
  4164. if not (AKey in PegCharSet) then
  4165. Accept := False;
  4166. end;
  4167. end;
  4168. end;
  4169. procedure TScfrmBigProjManage.actnOwnerImportUpdate(Sender: TObject);
  4170. var
  4171. vNode: TScProjManagerTreeNode;
  4172. begin
  4173. {$IFDEF _ScCrack}
  4174. if _IsFixedBills then
  4175. TAction(Sender).Enabled := False
  4176. else
  4177. begin
  4178. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4179. TAction(Sender).Enabled := TScMainForm(Application.MainForm).IsManageView
  4180. and Assigned(vNode) and (not vNode.IsFolder);
  4181. end;
  4182. {$ELSE}
  4183. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4184. TAction(Sender).Enabled := TScMainForm(Application.MainForm).IsManageView
  4185. and Assigned(vNode) and (not vNode.IsFolder);
  4186. {$ENDIF}
  4187. end;
  4188. procedure TScfrmBigProjManage.ExportCurrentRelaFile(ASave: Boolean);
  4189. var
  4190. iID, i: Integer;
  4191. Node: TZjGridTreeNode;
  4192. strFile, strNewFile, strAlias, strBPName, sAliasTemp, sPath: string;
  4193. begin
  4194. Node := ztRelaFiles.RowItems[zgRelaFiles.CurRow];
  4195. if (Node = nil) then
  4196. Exit;
  4197. iID := Integer(Node.Data);
  4198. with ProjectManager do
  4199. begin
  4200. cdsRelaFiles.Filtered := False;
  4201. if cdsRelaFiles.Locate('ID', iID, []) then
  4202. begin
  4203. strFile := ScExpandFileName(cdsRelaFilesFileName.AsString);
  4204. strAlias := cdsRelaFilesName.AsString;
  4205. sAliasTemp := strAlias;
  4206. end;
  4207. end;
  4208. strBPName := staBuildProjects.IDTree.Selected.Rec.ValueByName('Name').AsString;
  4209. if Pos(':\', ConfigInfo.OutputPath) > 0 then
  4210. sPath := ConfigInfo.OutputPath
  4211. else
  4212. sPath := ExtractFilePath(Application.ExeName) + ConfigInfo.OutputPath;
  4213. sPath := sPath + strBPName + '\';
  4214. if not DirectoryExists(sPath) then
  4215. ForceDirectories(sPath);
  4216. if Node.Parent = FFeeParent then
  4217. begin
  4218. sdExport.Filter := GetDialogExtString(dtFee);
  4219. FixFileExt(strAlias, SFeeRateFileExt);
  4220. sdExport.FileName := sPath + strAlias;
  4221. end
  4222. else if Node.Parent = FPriceParent then
  4223. begin
  4224. sdExport.Filter := GetDialogExtString(dtPrice);
  4225. FixFileExt(strAlias, SUnitPriceFileExt);
  4226. sdExport.FileName := sPath + strAlias;
  4227. end;
  4228. if sdExport.Execute then
  4229. begin
  4230. // chenshilong, 2011-02-22 17:35:46 导出前先强制保存
  4231. if ASave then
  4232. for i := 0 to ProjList.Count - 1 do
  4233. begin
  4234. if SameText(ProjList.ProjData[i].Alias, sAliasTemp) then
  4235. begin
  4236. ProjList.ProjData[i].Save;
  4237. Break;
  4238. end;
  4239. end;
  4240. strNewFile := sdExport.FileName;
  4241. if Node.Parent = FFeeParent then
  4242. FixFileExt(strNewFile, SFeeRateFileExt)
  4243. else if Node.Parent = FPriceParent then
  4244. FixFileExt(strNewFile, SUnitPriceFileExt);
  4245. CopyFile(PChar(strFile), PChar(strNewFile), False);
  4246. strAlias := ExtractFileNameWithoutExt(strNewFile);
  4247. FileArchiverManager.Alias[strNewFile] := strAlias;
  4248. end;
  4249. end;
  4250. procedure TScfrmBigProjManage.zgRelaFilesMouseDown(Sender: TObject;
  4251. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  4252. begin
  4253. if (Button = mbRight) and (ssCtrl in Shift) and (ssAlt in Shift) and (ssShift in Shift) then
  4254. ExportCurrentRelaFile(False);
  4255. end;
  4256. procedure TScfrmBigProjManage.ExportCurrentProjectFile(ASave: Boolean);
  4257. var
  4258. vTender, vBuildProj: TScProjManagerTreeNode;
  4259. bIsBills, bIsFixed: Boolean;
  4260. strFile, strAlias, strBPName, strSourceFile, sPath, strExt: string;
  4261. I: Integer;
  4262. begin
  4263. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4264. if Assigned(vTender) then
  4265. vBuildProj := TScProjManagerTreeNode(vTender.Parent)
  4266. else
  4267. vBuildProj := nil;
  4268. if not Assigned(vTender) or not vTender.IsTender then Exit;
  4269. if not Assigned(vBuildProj) or not vBuildProj.IsBuildProj then Exit;
  4270. strAlias := vTender.Rec.Name.AsString;
  4271. strSourceFile := vTender.Rec.FileName.AsString;
  4272. strFile := strAlias;
  4273. strBPName := vBuildProj.Rec.Name.AsString;
  4274. bIsBills := IsSmartCostBillsFile(strSourceFile);
  4275. bIsFixed := IsStaticBillsFile(strSourceFile);
  4276. // 固化清单因以前概念不清和设计缺陷(固化清单本应从属于招投标,但现在无论是标段类型还是文件头,固化清单都和招投标、概预算同级),
  4277. // 文件头分不开招投标和概预算,现全部当作招投标导出。
  4278. if bIsBills or bIsFixed then
  4279. begin
  4280. sdExport.Filter := GetDialogExtString(dtBills);
  4281. strExt := SBillsFileExt;
  4282. end
  4283. else
  4284. begin
  4285. sdExport.Filter := GetDialogExtString(dtBudget);
  4286. strExt := SBudgetFileExt;
  4287. end;
  4288. FixFileExt(strFile, strExt);
  4289. // if Pos(':\', ConfigInfo.OutputPath) > 0 then
  4290. // sPath := ConfigInfo.OutputPath
  4291. // else
  4292. // sPath := ExtractFilePath(Application.ExeName) + ConfigInfo.OutputPath;
  4293. // sPath := sPath + strBPName + '\';
  4294. sPath := GetCurrentDir + '\';
  4295. strFile := sPath + strFile;
  4296. if not DirectoryExists(sPath) then
  4297. ForceDirectories(sPath);
  4298. sdExport.FileName := strFile;
  4299. if sdExport.Execute then
  4300. begin
  4301. // Chenshilong, 2010-8-4 8:54:35 导出前保存先,单个保存,用Alias识别
  4302. if ASave then
  4303. for I := 0 to ProjList.Count - 1 do
  4304. begin
  4305. if SameText(ProjList.ProjData[i].FileName, strSourceFile) then
  4306. begin
  4307. ProjList.ProjData[i].Save;
  4308. Break;
  4309. end;
  4310. end;
  4311. strFile := sdExport.FileName;
  4312. FixFileExt(strFile, strExt);
  4313. if not CopyFile(PChar(strSourceFile), PChar(strFile), False) then
  4314. begin
  4315. MessageWarning('Copy file failed');
  4316. Exit;
  4317. end;
  4318. strAlias := ExtractFileNameWithoutExt(strFile);
  4319. FileArchiverManager.Alias[strFile] := strAlias;
  4320. end;
  4321. end;
  4322. procedure TScfrmBigProjManage.SaveAsRelaFile(ABPID: Integer; AFileName, ANewName,
  4323. AOldName: string; AType: Integer; ACheckExist: Boolean);
  4324. var
  4325. strFileType, strNewFile: string;
  4326. begin
  4327. if ACheckExist then
  4328. begin
  4329. if ProjectManager.RelaFileExists(ABPID, ANewName, AType) then
  4330. begin
  4331. strFileType := '';
  4332. if AType = FileType_FeeFile then
  4333. strFileType := '费率文件'
  4334. else if AType = FileType_PriceFile then
  4335. strFileType := '单价文件';
  4336. MessageHint(Format('%s[%s]已存在,请手工检查数据是否正确。', [strFileType, ANewName]));
  4337. Exit;
  4338. end;
  4339. end;
  4340. strNewFile := ConfigInfo.NewGUIDFileName;
  4341. if not CopyFile(PChar(AFileName), PChar(strNewFile), True) then
  4342. begin
  4343. MessageWarning('Can not copy file');
  4344. Exit;
  4345. end;
  4346. FileArchiverManager.Alias[strNewFile] := ANewName;
  4347. ProjectManager.AddRelaFile(strNewFile, ABPID, False);
  4348. end;
  4349. procedure TScfrmBigProjManage.SaveAsRelaFilesByProject(ABPID: Integer;
  4350. AOldTenderNode, ANewTenderNode: TScProjManagerTreeNode);
  4351. var
  4352. iOldID, iNewID: Integer;
  4353. strFile, strOldName, strNewName: string;
  4354. OldPropRec, NewPropRec: TsdDataRecord;
  4355. begin
  4356. if (AOldTenderNode = nil) or (ANewTenderNode = nil) then
  4357. Exit;
  4358. iOldID := AOldTenderNode.ID;
  4359. iNewID := ANewTenderNode.ID;
  4360. OldPropRec := ProjectManager.PropertiesRec(iOldID);
  4361. NewPropRec := ProjectManager.PropertiesRec(iNewID);
  4362. strNewName := ANewTenderNode.Rec.Name.AsString;
  4363. // 费率
  4364. strOldName := OldPropRec.ValueByName('Value3').AsString;
  4365. strFile := ProjectManager.GetProjectRelaFileName(iOldID, FileType_FeeFile);
  4366. SaveAsRelaFile(ABPID, strFile, strNewName, strOldName, FileType_FeeFile, True);
  4367. NewPropRec.ValueByName('Value3').AsString := strNewName;
  4368. // 单价
  4369. strOldName := OldPropRec.ValueByName('Value4').AsString;
  4370. strFile := ProjectManager.GetProjectRelaFileName(iOldID, FileType_PriceFile);
  4371. SaveAsRelaFile(ABPID, strFile, strNewName, strOldName, FileType_PriceFile, True);
  4372. NewPropRec.ValueByName('Value4').AsString := strNewName;
  4373. end;
  4374. function TScfrmBigProjManage.CanSaveAsRelaFilesByProject(
  4375. ATenderNode: TScProjManagerTreeNode): Boolean;
  4376. var
  4377. iID: Integer;
  4378. strFile: string;
  4379. PropRec: TsdDataRecord;
  4380. begin
  4381. Result := False;
  4382. if ATenderNode = nil then
  4383. Exit;
  4384. iID := ATenderNode.ID;
  4385. PropRec := ProjectManager.PropertiesRec(iID);
  4386. // 费率
  4387. strFile := ProjectManager.GetProjectRelaFileName(iID, FileType_FeeFile);
  4388. if not FileExists(strFile) then Exit;
  4389. // 单价
  4390. strFile := ProjectManager.GetProjectRelaFileName(iID, FileType_PriceFile);
  4391. if not FileExists(strFile) then Exit;
  4392. Result := True;
  4393. end;
  4394. function TScfrmBigProjManage.GetSmartProjType: Integer;
  4395. var vNode: TScProjManagerTreeNode;
  4396. begin
  4397. Result := -1;
  4398. if staBuildProjects.IDTree.Count = 0 then Exit;
  4399. vNode := FManageProjects.ManagerTree.Selected;
  4400. if vNode.IsFolder then
  4401. begin
  4402. Exit;
  4403. end
  4404. else if vNode.IsBuildProj then
  4405. begin
  4406. if not vNode.HasChildren then Exit;
  4407. vNode := TScProjManagerTreeNode(vNode.LastChild);
  4408. Result := vNode.Rec.ProjectType.AsInteger;
  4409. end
  4410. else if vNode.IsTender then
  4411. begin
  4412. vNode := TScProjManagerTreeNode(vNode.Parent.LastChild);
  4413. Result := vNode.Rec.ProjectType.AsInteger;
  4414. end;
  4415. end;
  4416. procedure TScfrmBigProjManage.actnOwnerExportUpdate(Sender: TObject);
  4417. begin
  4418. {$IFDEF _ScCrack}
  4419. if _IsFixedBills then
  4420. TAction(Sender).Enabled := False
  4421. else
  4422. TAction(Sender).Enabled := True;
  4423. {$ELSE}
  4424. TAction(Sender).Enabled := True;
  4425. {$ENDIF}
  4426. end;
  4427. procedure TScfrmBigProjManage.actnNewUpdate(Sender: TObject);
  4428. begin
  4429. {$IFDEF _ScExportOnly}
  4430. TAction(Sender).Enabled := False;
  4431. Exit;
  4432. {$ENDIF}
  4433. {$IFDEF _ScCrack}
  4434. if _IsFixedBills then
  4435. TAction(Sender).Enabled := False
  4436. else
  4437. TAction(Sender).Enabled := True;
  4438. {$ELSE}
  4439. TAction(Sender).Enabled := True;
  4440. {$ENDIF}
  4441. end;
  4442. procedure TScfrmBigProjManage.actnImportUpdate(Sender: TObject);
  4443. begin
  4444. {$IFDEF _ScCrack}
  4445. if _IsFixedBills then
  4446. TAction(Sender).Enabled := False
  4447. else
  4448. TAction(Sender).Enabled := True;
  4449. {$ELSE}
  4450. TAction(Sender).Enabled := True;
  4451. {$ENDIF}
  4452. end;
  4453. procedure TScfrmBigProjManage.tbtnTestClick(Sender: TObject);
  4454. var
  4455. vTender: TScProjManagerTreeNode;
  4456. strFile: string;
  4457. begin
  4458. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4459. if Assigned(vTender) and vTender.IsTender then
  4460. begin
  4461. strFile := ScExpandFileName(vTender.Rec.FileName.AsString);
  4462. //TScMainForm(Application.MainForm).OpenSilent(strFile);
  4463. end;
  4464. end;
  4465. procedure TScfrmBigProjManage.CalculateCurrentBP;
  4466. var
  4467. vNode: TScProjManagerTreeNode;
  4468. begin
  4469. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4470. if vNode.IsTender then
  4471. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.FindNode(vNode.ParentID));
  4472. if Assigned(vNode) and vNode.IsBuildProj then
  4473. begin
  4474. Screen.Cursor := crHourGlass;
  4475. try
  4476. ProjectManager.CalculateBP(vNode);
  4477. finally
  4478. Screen.Cursor := crDefault;
  4479. staBuildProjects.IDTree.SelectedIndex := vNode.MajorIndex;
  4480. zgBuildProjects.Invalidate;
  4481. end;
  4482. end;
  4483. end;
  4484. function TScfrmBigProjManage.CanCalculateCurrentBP: Boolean;
  4485. var
  4486. vNode: TScProjManagerTreeNode;
  4487. begin
  4488. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4489. Result := TScMainForm(Application.MainForm).IsManageView
  4490. and Assigned(vNode) and vNode.IsBuildProj;
  4491. end;
  4492. procedure TScfrmBigProjManage.zgBuildProjectsGetCellText(Sender: TObject;
  4493. const ACoord: TPoint; var Value: String; DisplayText: Boolean);
  4494. var
  4495. Col: Integer;
  4496. begin
  4497. Col := ACoord.X - zgBuildProjects.FixedColCount;
  4498. if Col = staBuildProjects.VisibleCol('ProjectType') then
  4499. begin
  4500. if SameText(Value, '0') then
  4501. Value := '';
  4502. end;
  4503. end;
  4504. procedure TScfrmBigProjManage.zgProjectsByBPCellCanEdit(Sender: TObject;
  4505. const ACoord: TPoint; var Allow: Boolean);
  4506. begin
  4507. Allow := ACoord.X = 1;
  4508. end;
  4509. procedure TScfrmBigProjManage.edtGatherCoeKeyPress(Sender: TObject;
  4510. var Key: Char);
  4511. begin
  4512. if not ValidFloat(Key) then MessageBeep(ID_OK);
  4513. end;
  4514. procedure TScfrmBigProjManage.edtGatherCoeChange(Sender: TObject);
  4515. var
  4516. vNode: TScProjManagerTreeNode;
  4517. fValue: Double;
  4518. begin
  4519. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4520. if vNode = nil then Exit;
  4521. if not TryStrToFloat(edtGatherCoe.Text, fValue) then
  4522. Exit;
  4523. ProjectManager.ChangeNewProgressiveFee(vNode.ID);
  4524. ProjectManager.SetProgressiveCoe(vNode.ID, fValue);
  4525. end;
  4526. procedure TScfrmBigProjManage.cbbGatherOtherFeeSelect(Sender: TObject);
  4527. var
  4528. vNode: TScProjManagerTreeNode;
  4529. begin
  4530. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4531. if vNode = nil then Exit;
  4532. ProjectManager.ChangeNewProgressiveFee(vNode.ID);
  4533. if cbbGatherOtherFee.ItemIndex = 0 then
  4534. ProjectManager.SetProgressiveType(vNode.ID, gmCalculate)
  4535. else if cbbGatherOtherFee.ItemIndex = 1 then
  4536. ProjectManager.SetProgressiveType(vNode.ID, gmAdd);
  4537. end;
  4538. procedure TScfrmBigProjManage.cbbProgressiveFileSelect(Sender: TObject);
  4539. var
  4540. iFileID: Integer;
  4541. vNode: TScProjManagerTreeNode;
  4542. begin
  4543. if cbbProgressiveFile.ItemIndex < 0 then
  4544. Exit;
  4545. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4546. if vNode = nil then Exit;
  4547. iFileID := Integer(cbbProgressiveFile.Items.Objects[cbbProgressiveFile.ItemIndex]);
  4548. ProjectManager.ChangeNewProgressiveFee(vNode.ID);
  4549. ProjectManager.SetProgressiveFileID(vNode.ID, iFileID);
  4550. ProjectManager.ClearExprsInGanSu34(vNode.ID);
  4551. end;
  4552. procedure TScfrmBigProjManage.actnCalculateBuildProjectUpdate(
  4553. Sender: TObject);
  4554. begin
  4555. actnCalculateBuildProject.Enabled := CanCalculateCurrentBP;
  4556. end;
  4557. procedure TScfrmBigProjManage.actnCalculateBuildProjectExecute(
  4558. Sender: TObject);
  4559. begin
  4560. CalculateCurrentBP;
  4561. end;
  4562. procedure TScfrmBigProjManage.cbbSiteConstructTypeSelect(Sender: TObject);
  4563. var
  4564. vNode: TScProjManagerTreeNode;
  4565. begin
  4566. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4567. if vNode = nil then Exit;
  4568. ProjectManager.ChangeNewSiteConstruct(vNode.ID);
  4569. if cbbSiteConstructType.ItemIndex = 0 then
  4570. ProjectManager.SetSiteConstructType(vNode.ID, gmCalculate)
  4571. else if cbbSiteConstructType.ItemIndex = 1 then
  4572. ProjectManager.SetSiteConstructType(vNode.ID, gmAdd);
  4573. end;
  4574. function TScfrmBigProjManage.NeedBatchCalc: Boolean;
  4575. var isGmCalc, hasMoreChildren: Boolean;
  4576. iBuildID, iCount: Integer;
  4577. vNode: TScProjManagerTreeNode;
  4578. begin
  4579. iBuildID := CurBuildProjID;
  4580. vNode := TScProjManagerTreeNode(staBuildProjects.IDTree.FindNode(iBuildID));
  4581. hasMoreChildren := (vNode.ChildCount > 1);
  4582. isGmCalc := (ProjectManager.GetProgressiveType(iBuildID) = gmCalculate) or
  4583. (ProjectManager.GetSiteConstructType(iBuildID) = gmCalculate);
  4584. Result := hasMoreChildren and isGmCalc;
  4585. end;
  4586. procedure TScfrmBigProjManage.OpenAllProjectsOfCurBP(var AList: TList);
  4587. var
  4588. Tenders: TList;
  4589. i: Integer;
  4590. Rec: TsdDataRecord;
  4591. projData: TScProjBaseData;
  4592. begin
  4593. CreateProgressForm(100, '后台打开项目>>>');
  4594. AList.Clear;
  4595. Tenders := TList.Create;
  4596. try
  4597. FManageProjects.LoadBuildProjectTenders(CurBuildProjID, Tenders);
  4598. for i := 0 to Tenders.Count - 1 do
  4599. begin
  4600. AddProgressForm(10, Format('正在后台打开第 %d 个项目...', [i + 1]));
  4601. Rec := TsdDataRecord(Tenders.Items[i]);
  4602. if ProjList.IndexByName(Rec.ValueByName('FileName').AsString) = nil then
  4603. begin
  4604. projData := ProjList.AddProj(Rec.ValueByName('FileName').AsString);
  4605. projData.CreateProject;
  4606. projData.Project.OpenConnection;
  4607. ProjData.Project.DoAfterOpenConnection;
  4608. projData.Project.Open(oftOpen);
  4609. end
  4610. else
  4611. projData := ProjList.IndexByName(Rec.ValueByName('FileName').AsString);
  4612. AList.Add(projData.Project);
  4613. end;
  4614. finally
  4615. Tenders.Free;
  4616. end;
  4617. end;
  4618. procedure TScfrmBigProjManage.RefreshBuildProjectPropertyView(
  4619. ABuildProjectID: Integer);
  4620. var
  4621. I, iIdx, iOffset, iRow: Integer;
  4622. PPropNameMap: PScPropertyFieldNameMap;
  4623. PropRec: TsdDataRecord;
  4624. begin
  4625. FIsPropLoading := True;
  4626. try
  4627. zgBPBasic.Clear;
  4628. zgBPZhaoBiao.Clear;
  4629. zgBPTouBiao.Clear;
  4630. PropRec := ProjectManager.PropertiesRec(ABuildProjectID);
  4631. if PropRec = nil then
  4632. Exit;
  4633. // 基本信息
  4634. zgBPBasic.RowCount := zgBPBasic.FixedRowCount + 10;
  4635. iOffset := 0;
  4636. for I := 0 to 9 do
  4637. begin
  4638. iIdx := I + iOffset;
  4639. PPropNameMap := @(BuildProjectFieldNameMaps[iIdx]);
  4640. iRow := zgBPBasic.FixedRowCount + I;
  4641. zgBPBasic.Cells[1, iRow].Text := PPropNameMap^.Caption;
  4642. zgBPBasic.Cells[2, iRow].Text := ProjectManager.GetBuildProjectProperty(PropRec, PPropNameMap^.Name);
  4643. zgBPBasic.Cells[2, iRow].Data := PPropNameMap;
  4644. // 编制日期
  4645. if SameText(PPropNameMap^.Name, SEditDate) then
  4646. zgBPBasic.CellClass.Item[2, iRow] := TZjComboCell
  4647. // 公路等级
  4648. else if SameText(PPropNameMap^.Name, SRoadLevel) then
  4649. zgBPBasic.CellClass.Item[2, iRow] := TZjComboCell;
  4650. end;
  4651. // 招标信息
  4652. zgBPZhaoBiao.RowCount := zgBPZhaoBiao.FixedRowCount + 7;
  4653. iOffset := 10;
  4654. for I := 0 to 6 do
  4655. begin
  4656. iIdx := I + iOffset;
  4657. PPropNameMap := @(BuildProjectFieldNameMaps[iIdx]);
  4658. iRow := zgBPZhaoBiao.FixedRowCount + I;
  4659. zgBPZhaoBiao.Cells[1, iRow].Text := PPropNameMap^.Caption;
  4660. zgBPZhaoBiao.Cells[2, iRow].Text := ProjectManager.GetBuildProjectProperty(PropRec, PPropNameMap^.Name);
  4661. zgBPZhaoBiao.Cells[2, iRow].Data := PPropNameMap;
  4662. end;
  4663. // 招标信息
  4664. zgBPTouBiao.RowCount := zgBPTouBiao.FixedRowCount + 10;
  4665. iOffset := 17;
  4666. for I := 0 to 9 do
  4667. begin
  4668. iIdx := I + iOffset;
  4669. PPropNameMap := @(BuildProjectFieldNameMaps[iIdx]);
  4670. iRow := zgBPTouBiao.FixedRowCount + I;
  4671. zgBPTouBiao.Cells[1, iRow].Text := PPropNameMap^.Caption;
  4672. zgBPTouBiao.Cells[2, iRow].Text := ProjectManager.GetBuildProjectProperty(PropRec, PPropNameMap^.Name);
  4673. zgBPTouBiao.Cells[2, iRow].Data := PPropNameMap;
  4674. end;
  4675. finally
  4676. FIsPropLoading := False;
  4677. end;
  4678. end;
  4679. procedure TScfrmBigProjManage.zgBPBasicCellCanEdit(Sender: TObject;
  4680. const ACoord: TPoint; var Allow: Boolean);
  4681. begin
  4682. Allow := ACoord.X = 2;
  4683. end;
  4684. procedure TScfrmBigProjManage.zgBPZhaoBiaoCellCanEdit(Sender: TObject;
  4685. const ACoord: TPoint; var Allow: Boolean);
  4686. begin
  4687. Allow := ACoord.X = 2;
  4688. end;
  4689. procedure TScfrmBigProjManage.zgBPTouBiaoCellCanEdit(Sender: TObject;
  4690. const ACoord: TPoint; var Allow: Boolean);
  4691. begin
  4692. Allow := ACoord.X = 2;
  4693. end;
  4694. procedure TScfrmBigProjManage.zgBPBasicCellTextChanged(Sender: TObject;
  4695. Col, Row: Integer);
  4696. var
  4697. vTender: TScProjManagerTreeNode;
  4698. PPropNameMap: PScPropertyFieldNameMap;
  4699. PropRec: TsdDataRecord;
  4700. begin
  4701. if FIsPropLoading then
  4702. Exit;
  4703. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4704. if not Assigned(vTender) then
  4705. Exit;
  4706. PropRec := ProjectManager.PropertiesRec(vTender.ID);
  4707. PPropNameMap := PScPropertyFieldNameMap(zgBPBasic.Cells[2, Row].Data);
  4708. if PPropNameMap <> nil then
  4709. PropRec.ValueByName(PPropNameMap^.Field).AsString := zgBPBasic.Cells[2, Row].Text;
  4710. end;
  4711. procedure TScfrmBigProjManage.zgBPBasicCellGetColor(Sender: TObject;
  4712. ACoord: TPoint; var AColor: TColor);
  4713. begin
  4714. if ACoord.X = 1 then
  4715. AColor := clBtnFace;
  4716. end;
  4717. procedure TScfrmBigProjManage.zgBPZhaoBiaoCellGetColor(Sender: TObject;
  4718. ACoord: TPoint; var AColor: TColor);
  4719. begin
  4720. if ACoord.X = 1 then
  4721. AColor := clBtnFace;
  4722. end;
  4723. procedure TScfrmBigProjManage.zgBPTouBiaoCellGetColor(Sender: TObject;
  4724. ACoord: TPoint; var AColor: TColor);
  4725. begin
  4726. if ACoord.X = 1 then
  4727. AColor := clBtnFace;
  4728. end;
  4729. procedure TScfrmBigProjManage.zgBPBasicGetCellEditor(Sender: TObject;
  4730. ACoord: TPoint; var AControl: TWinControl);
  4731. var
  4732. PPropNameMap: PScPropertyFieldNameMap;
  4733. begin
  4734. if ACoord.X <> 2 then Exit;
  4735. PPropNameMap := PScPropertyFieldNameMap(zgBPBasic.Cells[2, ACoord.Y].Data);
  4736. if SameText(PPropNameMap^.Name, SEditDate) then
  4737. AControl := dtpEditDate
  4738. else if SameText(PPropNameMap^.Name, SRoadLevel) then
  4739. begin
  4740. cbbProperties.Clear;
  4741. cbbProperties.Items.Add('高速公路');
  4742. cbbProperties.Items.Add('一级公路');
  4743. cbbProperties.Items.Add('二级公路');
  4744. cbbProperties.Items.Add('三级公路');
  4745. cbbProperties.Items.Add('四级公路');
  4746. AControl := cbbProperties;
  4747. end;
  4748. end;
  4749. procedure TScfrmBigProjManage.ImportXML_ZheJiang;
  4750. var
  4751. strFile: string;
  4752. begin
  4753. strFile := BrowseZheJiangXMLFile;
  4754. if strFile <> '' then
  4755. ScXMLToBuildProject.ImportXML_ZheJiang(strFile, '');
  4756. end;
  4757. procedure TScfrmBigProjManage.zgBPBasicEditorLoadCell(Sender: TObject;
  4758. ACoord: TPoint; AControl: TWinControl);
  4759. var
  4760. vTender: TScProjManagerTreeNode;
  4761. PPropNameMap: PScPropertyFieldNameMap;
  4762. PropRec: TsdDataRecord;
  4763. strValue: string;
  4764. begin
  4765. if ACoord.X <> 2 then Exit;
  4766. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4767. if not Assigned(vTender) then
  4768. Exit;
  4769. PropRec := ProjectManager.PropertiesRec(vTender.ID);
  4770. PPropNameMap := PScPropertyFieldNameMap(zgBPBasic.Cells[2, ACoord.Y].Data);
  4771. if not Assigned(PPropNameMap) then
  4772. Exit;
  4773. strValue := PropRec.ValueByName(PPropNameMap^.Field).AsString;
  4774. if SameText(PPropNameMap^.Name, SEditDate) then
  4775. begin
  4776. if strValue = '' then
  4777. dtpEditDate.Date := Date
  4778. else
  4779. dtpEditDate.Date := ScStrToDate(strValue);
  4780. end
  4781. else if SameText(PPropNameMap^.Name, SRoadLevel) then
  4782. cbbProperties.Text := strValue;
  4783. end;
  4784. procedure TScfrmBigProjManage.zgBPBasicEditorSaveCell(Sender: TObject;
  4785. ACoord: TPoint; AControl: TWinControl);
  4786. var
  4787. PPropNameMap: PScPropertyFieldNameMap;
  4788. begin
  4789. if ACoord.X <> 2 then Exit;
  4790. PPropNameMap := PScPropertyFieldNameMap(zgBPBasic.Cells[2, ACoord.Y].Data);
  4791. if not Assigned(PPropNameMap) then
  4792. Exit;
  4793. if SameText(PPropNameMap^.Name, SEditDate) then
  4794. zgBPBasic.Cells[ACoord.X, ACoord.Y].Text := FormatDateTime('yyyy-mm-dd', dtpEditDate.Date)
  4795. else if SameText(PPropNameMap^.Name, SRoadLevel) then
  4796. zgBPBasic.Cells[ACoord.X, ACoord.Y].Text := cbbProperties.Text;
  4797. end;
  4798. procedure TScfrmBigProjManage.zgBPZhaoBiaoCellTextChanged(Sender: TObject;
  4799. Col, Row: Integer);
  4800. var
  4801. vTender: TScProjManagerTreeNode;
  4802. PPropNameMap: PScPropertyFieldNameMap;
  4803. PropRec: TsdDataRecord;
  4804. begin
  4805. if FIsPropLoading then
  4806. Exit;
  4807. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4808. if not Assigned(vTender) then
  4809. Exit;
  4810. PropRec := ProjectManager.PropertiesRec(vTender.ID);
  4811. PPropNameMap := PScPropertyFieldNameMap(zgBPZhaoBiao.Cells[2, Row].Data);
  4812. if PPropNameMap <> nil then
  4813. PropRec.ValueByName(PPropNameMap^.Field).AsString := zgBPZhaoBiao.Cells[2, Row].Text;
  4814. end;
  4815. procedure TScfrmBigProjManage.zgBPTouBiaoCellTextChanged(Sender: TObject;
  4816. Col, Row: Integer);
  4817. var
  4818. vTender: TScProjManagerTreeNode;
  4819. PPropNameMap: PScPropertyFieldNameMap;
  4820. PropRec: TsdDataRecord;
  4821. begin
  4822. if FIsPropLoading then
  4823. Exit;
  4824. vTender := TScProjManagerTreeNode(staBuildProjects.IDTree.Selected);
  4825. if not Assigned(vTender) then
  4826. Exit;
  4827. PropRec := ProjectManager.PropertiesRec(vTender.ID);
  4828. PPropNameMap := PScPropertyFieldNameMap(zgBPTouBiao.Cells[2, Row].Data);
  4829. if PPropNameMap <> nil then
  4830. PropRec.ValueByName(PPropNameMap^.Field).AsString := zgBPTouBiao.Cells[2, Row].Text;
  4831. end;
  4832. procedure TScfrmBigProjManage.DoOnExportProjectXML(Sender: TObject);
  4833. begin
  4834. AddConnectionToPDF(TScProject(Sender).ADOConnection);
  4835. end;
  4836. procedure TScfrmBigProjManage.ExportBPProperties(ABuildProjectID: Integer;
  4837. AProperties: TStrings);
  4838. var
  4839. I: Integer;
  4840. PropRec: TsdDataRecord;
  4841. PPropNameMap: PScPropertyFieldNameMap;
  4842. begin
  4843. PropRec := FManageProjects.PropertiesRec(ABuildProjectID);
  4844. for I := Low(BuildProjectFieldNameMaps) to High(BuildProjectFieldNameMaps) do
  4845. begin
  4846. PPropNameMap := @(BuildProjectFieldNameMaps[I]);
  4847. AProperties.Add(PropRec.ValueByName(PPropNameMap^.Field).AsString);
  4848. end;
  4849. end;
  4850. procedure TScfrmBigProjManage.ImportBPProperties(ABuildProjectID: Integer;
  4851. AProperties: TStrings);
  4852. var
  4853. I: Integer;
  4854. PropRec: TsdDataRecord;
  4855. PPropNameMap: PScPropertyFieldNameMap;
  4856. begin
  4857. PropRec := FManageProjects.PropertiesRec(ABuildProjectID);
  4858. for I := Low(BuildProjectFieldNameMaps) to High(BuildProjectFieldNameMaps) do
  4859. begin
  4860. PPropNameMap := @(BuildProjectFieldNameMaps[I]);
  4861. PropRec.ValueByName(PPropNameMap^.Field).AsString := AProperties[I];
  4862. end;
  4863. end;
  4864. end.