ScBigProjManageView.pas 176 KB

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