uo_cusprice.sru 80 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795
  1. $PBExportHeader$uo_cusprice.sru
  2. forward
  3. global type uo_cusprice from nonvisualobject
  4. end type
  5. end forward
  6. global type uo_cusprice from nonvisualobject
  7. end type
  8. global uo_cusprice uo_cusprice
  9. type variables
  10. Int uo_option_checkprice_native
  11. Int uo_option_price_rmb
  12. Int uo_option_saleprice_list_rebate
  13. Long cur_poid
  14. datastore ds_pzmx
  15. boolean if_chk_mxlist = false //报价时用,true时,使用客户价格表, false时,自己选择价格表
  16. //boolean if_cmpl_mtrl_chg_auto = True
  17. boolean if_cmpl_zhpz_pf = false
  18. //string cmpl_zhpz_cfgname = ''
  19. s_mtrlcfg_expr s_zhpz[]
  20. end variables
  21. forward prototypes
  22. Public Function Integer uof_autodel_cuspricemx (DateTime arg_begindate, Boolean arg_ifcommit, Ref String arg_msg)
  23. Public Function Integer uof_del_cusprice (Long arg_cusid, Long arg_mtrlid, DateTime arg_opdate, Long arg_printid, Long arg_moneyid, Boolean arg_ifcommit, Ref String arg_msg)
  24. public function integer uof_pricestr_cmp (string arg_pricestr, string arg_status, string arg_woodcode, string arg_pcode, ref decimal arg_price)
  25. Public Function Integer uof_update_custprice (Integer arg_ifth, Long arg_scid, Long arg_cusid, Long arg_mtrlid, String arg_mtrlcode, String arg_status, String arg_woodcode, String arg_pcode, Long arg_outwareid, String arg_outwarecode, DateTime arg_outdate, Decimal arg_fprice, Decimal arg_zqrate, Decimal arg_cost, Long arg_flag, String arg_dscrp, Long arg_printid, Integer arg_buildtype, Long arg_moneyid, Decimal arg_qty, Decimal arg_qty1, Boolean arg_ifcommit, Ref String arg_msg)
  26. public function integer uof_check_price_saletask (long arg_typeid, long arg_cusid, long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_woodcode, string arg_pcode, long arg_moneyid, long arg_scid, long arg_quoteid, long arg_quoteprintid, decimal arg_price, decimal arg_qty, ref string arg_msg)
  27. public function integer uof_check_price (long arg_cusid, long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_pcode, string arg_woodcode, long arg_moneyid, decimal arg_price, decimal arg_qty, ref string arg_msg)
  28. public function integer uof_getmtrlcusprice (long arg_moneyid, long arg_mtrlid, long arg_cusid, ref decimal arg_price, ref decimal arg_zqrate, string arg_status, string arg_woodcode, string arg_pcode, decimal arg_qty, ref string arg_msg)
  29. public function integer uof_getprice_saletask (long arg_moneyid, long arg_cusid, long arg_mtrlid, string arg_status, string arg_woodcode, string arg_pcode, decimal arg_qty, long arg_scid, long arg_quoteid, long arg_quoteprintid, integer arg_typeid, ref decimal arg_price, ref decimal arg_rebate, ref string arg_msg)
  30. public function integer uof_get_pricelistid (long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_woodcode, string arg_pcode, decimal arg_qty, long arg_moneyid, ref long arg_pricelistid, ref string arg_msg)
  31. Public Function Integer uof_chk_pricelistid (Long arg_moneyid, Ref Long arg_pricelistid, Ref String arg_msg)
  32. Public Function Integer uof_del_cusprice_auto (Long arg_cusid, Long arg_outwareid, Long arg_printid, Long arg_mtrlid, String arg_status, String arg_woodcode, String arg_pcode, Integer arg_buildtype, Long arg_moneyid, Decimal arg_qty, Decimal arg_qty1, Boolean arg_ifcommit, Ref String arg_msg)
  33. public function integer uf_cmpl_price_zhpz (long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_woodcode, string arg_pcode, decimal arg_qty, long arg_pricelistid, long arg_moneyid, decimal arg_rebate_cus, ref decimal rtn_price, ref decimal rtn_zqrate, ref string arg_msg)
  34. public function integer uf_cmpl_price (long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_woodcode, string arg_pcode, decimal arg_qty, long arg_pricelistid, long arg_moneyid, decimal arg_rebate_cus, integer arg_price_ifpz, ref decimal rtn_price, ref decimal rtn_zqrate, ref string arg_msg)
  35. public function integer uof_get_pricelistinfo (long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_woodcode, string arg_pcode, string arg_status_ori, string arg_woodcode_ori, string arg_pcode_ori, decimal arg_qty, long arg_pricelistid, ref decimal arg_lmsaleprice, ref integer arg_flag, ref string arg_listname, ref decimal arg_rebate, ref string arg_msg)
  36. public function integer uof_get_pricelist_price (long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_woodcode, string arg_pcode, string arg_status_ori, string arg_woodcode_ori, string arg_pcode_ori, decimal arg_qty, long arg_pricelistid, long arg_moneyid, ref decimal arg_lmsaleprice, ref integer arg_flag, ref string arg_listname, ref decimal arg_rebate, ref string arg_msg)
  37. public function integer uf_cmpl_price_pack (long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_woodcode, string arg_pcode, decimal arg_qty, long arg_pricelistid, long arg_moneyid, decimal arg_rebate_cus, integer arg_price_ifpz, ref decimal rtn_price, ref decimal rtn_zqrate, ref string arg_msg)
  38. public function integer uof_get_mtrl_bjpz (ref datastore ds, long arg_pztype, long arg_type, string arg_col_value_dft, string arg_col_value, integer arg_mtrlpztype, ref string arg_msg)
  39. public function integer uof_get_mtrl_ygpz (ref datastore ds, long arg_pztype, long arg_type, string arg_col_value_dft, string arg_col_value, ref string arg_msg)
  40. public function integer uof_get_mtrl_3pz_difprice (long arg_mtrlid, string arg_status, string arg_woodcode, string arg_pcode, ref decimal arg_difprice, ref string arg_msg)
  41. public function integer uof_getprice_quote (long arg_moneyid, long arg_pricelistid, long arg_cusid, long arg_mtrlid, string arg_status, string arg_woodcode, string arg_pcode, decimal arg_qty, long arg_scid, ref decimal arg_price, ref decimal arg_rebate, ref string arg_msg)
  42. end prototypes
  43. Public Function Integer uof_autodel_cuspricemx (DateTime arg_begindate, Boolean arg_ifcommit, Ref String arg_msg);
  44. //uf_autodel_cuspricemx(arg_begindate,arg_ifcommit,arg_msg)
  45. //自动删除客户销售价格明细?指定时间以前的
  46. Long rslt = 1
  47. Long cnt = 0
  48. //参数检查
  49. IF arg_begindate < DateTime(Date('1900-01-01'),Time(0)) THEN MessageBox('提示','日期太早了')
  50. IF Trim(arg_msg) = '' THEN arg_msg = ''
  51. //删除时间范围内的记录
  52. IF MessageBox(' 重要提示','删除指定时间以前所有商品采购历史价格记录(不能恢复),确认吗?',Exclamation!,OKCancel!) = 1 THEN
  53. DELETE FROM u_spt_price_mx
  54. Where u_spt_price_mx.opdate <= :arg_begindate;
  55. IF sqlca.SQLCode <> 0 THEN
  56. rslt = 0
  57. arg_msg = '因网络或其他原因删除失败'+sqlca.SQLErrText
  58. GOTO ext
  59. END IF
  60. END IF
  61. ext:
  62. IF rslt = 0 THEN
  63. ROLLBACK;
  64. ELSEIF rslt = 1 And arg_ifcommit THEN
  65. COMMIT;
  66. END IF
  67. RETURN rslt
  68. END Function
  69. Public Function Integer uof_del_cusprice (Long arg_cusid, Long arg_mtrlid, DateTime arg_opdate, Long arg_printid, Long arg_moneyid, Boolean arg_ifcommit, Ref String arg_msg);
  70. Int rslt = 1
  71. Long cnt = 0
  72. SELECT count(*)
  73. INTO :cnt
  74. FROM u_cust
  75. Where u_cust.cusid = :arg_cusid;
  76. IF sqlca.SQLCode <> 0 THEN
  77. rslt = 0
  78. arg_msg = '因网络和其他原因查询客户资料失败'+sqlca.SQLErrText
  79. GOTO ext
  80. END IF
  81. IF cnt = 0 THEN
  82. rslt = 0
  83. arg_msg = '客户不存在'
  84. GOTO ext
  85. END IF
  86. SELECT count(*)
  87. INTO :cnt
  88. FROM u_mtrldef
  89. Where u_mtrldef.mtrlid = :arg_mtrlid;
  90. IF sqlca.SQLCode <> 0 THEN
  91. rslt = 0
  92. arg_msg = '因网络和其他原因查询物料资料失败'+sqlca.SQLErrText
  93. GOTO ext
  94. END IF
  95. IF cnt = 0 THEN
  96. rslt = 0
  97. arg_msg = '物料不存在'
  98. GOTO ext
  99. END IF
  100. DELETE FROM u_cus_price_mx
  101. WHERE u_cus_price_mx.cusid = :arg_cusid
  102. AND u_cus_price_mx.mtrlid = :arg_mtrlid
  103. AND u_cus_price_mx.opdate = :arg_opdate
  104. AND u_cus_price_mx.printid = :arg_printid
  105. And u_cus_price_mx.moneyid = :arg_moneyid;
  106. IF sqlca.SQLCode <> 0 THEN
  107. rslt = 0
  108. arg_msg = '查询失败'+sqlca.SQLErrText
  109. GOTO ext
  110. END IF
  111. ext:
  112. IF rslt = 0 THEN
  113. ROLLBACK;
  114. ELSEIF rslt = 1 And arg_ifcommit THEN
  115. COMMIT;
  116. END IF
  117. RETURN rslt
  118. END Function
  119. public function integer uof_pricestr_cmp (string arg_pricestr, string arg_status, string arg_woodcode, string arg_pcode, ref decimal arg_price);
  120. Int rslt = 1
  121. String s_rtn
  122. datastore ds_pricestr
  123. ds_pricestr = Create datastore
  124. ds_pricestr.DataObject = 'ds_pricestr_cmpl'
  125. ds_pricestr.SetTransObject(sqlca)
  126. ds_pricestr.Retrieve()
  127. IF Trim(arg_pricestr) = '' THEN
  128. rslt = 2
  129. GOTO ext
  130. END IF
  131. SELECT Top 1 Replace( :arg_pricestr,'不包含',' not like ') Into :arg_pricestr From u_user;
  132. SELECT Top 1 Replace( :arg_pricestr,'不等于','<>') Into :arg_pricestr From u_user;
  133. SELECT Top 1 Replace( :arg_pricestr,'包含',' like ') Into :arg_pricestr From u_user;
  134. SELECT Top 1 Replace( :arg_pricestr,'等于',' = ') Into :arg_pricestr From u_user;
  135. //'配置'需放在最后一行, 因为配置1, 配置2 没替换的话,有可能导致替换剩下个1 或2
  136. SELECT Top 1 Replace( :arg_pricestr,'配置1',"'"+:arg_woodcode+"'") Into :arg_pricestr From u_user;
  137. SELECT Top 1 Replace( :arg_pricestr,'配置2',"'"+:arg_pcode+"'") Into :arg_pricestr From u_user;
  138. SELECT Top 1 Replace( :arg_pricestr,'配置',"'"+:arg_status+"'") Into :arg_pricestr From u_user;
  139. ds_pricestr.Modify('cmpl.expression= "'+arg_pricestr+'"')
  140. s_rtn = String(ds_pricestr.Object.cmpl[1])
  141. IF s_rtn = 'false' THEN
  142. rslt = 0
  143. arg_price = 0
  144. ELSE
  145. arg_price = Round(Dec(s_rtn),5)
  146. END IF
  147. ext:
  148. Destroy ds_pricestr
  149. RETURN rslt
  150. end function
  151. Public Function Integer uof_update_custprice (Integer arg_ifth, Long arg_scid, Long arg_cusid, Long arg_mtrlid, String arg_mtrlcode, String arg_status, String arg_woodcode, String arg_pcode, Long arg_outwareid, String arg_outwarecode, DateTime arg_outdate, Decimal arg_fprice, Decimal arg_zqrate, Decimal arg_cost, Long arg_flag, String arg_dscrp, Long arg_printid, Integer arg_buildtype, Long arg_moneyid, Decimal arg_qty, Decimal arg_qty1, Boolean arg_ifcommit, Ref String arg_msg);
  152. Long rslt = 1
  153. Long cnt = 0
  154. DateTime server_dt
  155. IF arg_ifth = 1 THEN
  156. rslt = 1
  157. GOTO ext
  158. END IF
  159. //检查参数
  160. IF IsNull(arg_cusid) THEN arg_cusid = 0
  161. IF IsNull(arg_mtrlid) THEN arg_mtrlid = 0
  162. IF IsNull(arg_status) THEN arg_status = ''
  163. IF IsNull(arg_woodcode) THEN arg_woodcode = ''
  164. IF IsNull(arg_pcode) THEN arg_pcode = ''
  165. IF IsNull(arg_moneyid) THEN arg_moneyid = 0
  166. IF IsNull(arg_qty) THEN arg_qty = 0
  167. IF IsNull(arg_qty1) THEN arg_qty1 = 0
  168. IF arg_outdate <= DateTime(Date('1900-01-01'),Time(0)) THEN
  169. rslt = 0
  170. arg_msg = '错误的发生时间'
  171. GOTO ext
  172. END IF
  173. arg_outwarecode = Trim(arg_outwarecode)
  174. //获得服务器时间
  175. SELECT Top 1 getdate() Into :server_dt From u_user;
  176. //检查客户存在否
  177. SELECT count(*)
  178. INTO :cnt
  179. FROM u_cust
  180. Where u_cust.cusid = :arg_cusid;
  181. IF sqlca.SQLCode <> 0 THEN
  182. rslt = 0
  183. arg_msg = '因网络和其他原因查询客户资料失败'+sqlca.SQLErrText
  184. GOTO ext
  185. END IF
  186. IF cnt = 0 THEN
  187. rslt = 0
  188. arg_msg = '客户不存在'
  189. GOTO ext
  190. END IF
  191. cnt = 0
  192. SELECT count(*) INTO :cnt
  193. FROM cw_currency
  194. Where moneyid = :arg_moneyid;
  195. IF sqlca.SQLCode <> 0 THEN
  196. arg_msg = '查询币种失败'
  197. rslt = 0
  198. GOTO ext
  199. END IF
  200. IF cnt = 0 THEN
  201. arg_msg = '币种资料不存在'
  202. rslt = 0
  203. GOTO ext
  204. END IF
  205. //检查商品存在否
  206. SELECT count(*)
  207. INTO :cnt
  208. FROM u_mtrldef
  209. Where u_mtrldef.mtrlid = :arg_mtrlid;
  210. IF sqlca.SQLCode <> 0 THEN
  211. rslt = 0
  212. arg_msg = '因网络和其他原因查询物料:'+arg_mtrlcode+'失败'+sqlca.SQLErrText
  213. GOTO ext
  214. END IF
  215. IF cnt = 0 THEN
  216. rslt = 0
  217. arg_msg = '物料不存在:'+arg_mtrlcode
  218. GOTO ext
  219. END IF
  220. // //检查数量范围内是否有重复?
  221. //SELECT count(*)
  222. // INTO :cnt
  223. // FROM u_cus_price
  224. // WHERE u_cus_price.cusid = :arg_cusid AND
  225. // u_cus_price.mtrlid = :arg_mtrlid AND
  226. // u_cus_price.status = :arg_status AND
  227. // u_cus_price.woodcode = :arg_woodcode AND
  228. // u_cus_price.pcode = :arg_pcode and
  229. // ( ( u_cus_price.qty > :arg_qty) AND (u_cus_price.qty < :arg_qty1) or
  230. // ( u_cus_price.qty1 > :arg_qty) AND (u_cus_price.qty1 < :arg_qty1) ) and
  231. // u_cus_price.moneyid = :arg_moneyid
  232. // u_cus_price.ifcancel = 0 ;
  233. //IF sqlca.SQLCode <> 0 THEN
  234. // rslt = 0
  235. // arg_msg = '因网络和其他原因查询客户产品:'+arg_mtrlcode+'最新价格失败'+sqlca.SQLErrText
  236. // GOTO ext
  237. //END IF
  238. //
  239. //IF cnt > 0 THEN
  240. // rslt = 0
  241. // arg_msg = '物料:'+arg_mtrlcode+"数量范围:"+string(arg_qty,'#,##0.#####')+'到'+string(arg_qty1,'#,##0.#####') +'有重叠'
  242. // GOTO ext
  243. //END IF
  244. //1.更新客户销售价表
  245. SELECT count(*)
  246. INTO :cnt
  247. FROM u_cus_price
  248. WHERE u_cus_price.cusid = :arg_cusid AND
  249. u_cus_price.mtrlid = :arg_mtrlid AND
  250. u_cus_price.status = :arg_status AND
  251. u_cus_price.woodcode = :arg_woodcode AND
  252. u_cus_price.pcode = :arg_pcode AND
  253. ( u_cus_price.qty = :arg_qty) AND
  254. (u_cus_price.qty1 = :arg_qty1) AND
  255. u_cus_price.moneyid = :arg_moneyid;
  256. IF sqlca.SQLCode <> 0 THEN
  257. rslt = 0
  258. arg_msg = '因网络和其他原因查询客户产品:'+arg_mtrlcode+'最新价格失败'+sqlca.SQLErrText
  259. GOTO ext
  260. END IF
  261. IF cnt > 0 THEN
  262. IF arg_buildtype = 0 THEN
  263. UPDATE u_cus_price
  264. SET u_cus_price.cusid = :arg_cusid,
  265. u_cus_price.mtrlid = :arg_mtrlid,
  266. u_cus_price.price = :arg_fprice * :arg_zqrate,
  267. u_cus_price.fprice = :arg_fprice,
  268. u_cus_price.zqrate = :arg_zqrate,
  269. u_cus_price.sys_changetime = getdate(),
  270. u_cus_price.ifcancel = 0
  271. WHERE u_cus_price.cusid = :arg_cusid AND
  272. u_cus_price.mtrlid = :arg_mtrlid AND
  273. u_cus_price.status = :arg_status AND
  274. u_cus_price.woodcode = :arg_woodcode AND
  275. u_cus_price.pcode = :arg_pcode AND
  276. ( u_cus_price.qty = :arg_qty) AND
  277. (u_cus_price.qty1 = :arg_qty1) AND
  278. u_cus_price.moneyid = :arg_moneyid;
  279. IF sqlca.SQLCode <> 0 THEN
  280. rslt = 0
  281. arg_msg = '因网络和其它原因,客户销售价表更新'+arg_mtrlcode+'失败'+sqlca.SQLErrText
  282. GOTO ext
  283. END IF
  284. ELSEIF arg_buildtype = 2 THEN
  285. UPDATE u_cus_price
  286. SET u_cus_price.cusid = :arg_cusid,
  287. u_cus_price.mtrlid = :arg_mtrlid,
  288. u_cus_price.price_bj = :arg_fprice * :arg_zqrate,
  289. u_cus_price.fprice_bj = :arg_fprice,
  290. u_cus_price.zqrate_bj = :arg_zqrate,
  291. u_cus_price.sys_changetime = getdate(),
  292. u_cus_price.ifcancel = 0
  293. WHERE u_cus_price.cusid = :arg_cusid AND
  294. u_cus_price.mtrlid = :arg_mtrlid AND
  295. u_cus_price.status = :arg_status AND
  296. u_cus_price.woodcode = :arg_woodcode AND
  297. u_cus_price.pcode = :arg_pcode AND
  298. ( u_cus_price.qty = :arg_qty) AND
  299. (u_cus_price.qty1 = :arg_qty1) AND
  300. u_cus_price.moneyid = :arg_moneyid;
  301. IF sqlca.SQLCode <> 0 THEN
  302. rslt = 0
  303. arg_msg = '因网络和其它原因,客户销售价表更新'+arg_mtrlcode+'失败'+sqlca.SQLErrText
  304. GOTO ext
  305. END IF
  306. END IF
  307. ELSEIF cnt = 0 THEN
  308. IF arg_buildtype = 0 THEN
  309. INSERT INTO u_cus_price
  310. (cusid,
  311. mtrlid,
  312. price,
  313. fprice,
  314. zqrate,
  315. dscrp,
  316. status,
  317. woodcode,
  318. pcode,
  319. moneyid,
  320. sys_changetime,
  321. qty,
  322. qty1)
  323. VALUES
  324. (:arg_cusid,
  325. :arg_mtrlid,
  326. :arg_fprice * :arg_zqrate,
  327. :arg_fprice,
  328. :arg_zqrate,
  329. :arg_dscrp,
  330. :arg_status,
  331. :arg_woodcode,
  332. :arg_pcode,
  333. :arg_moneyid,
  334. getdate(),
  335. :arg_qty,
  336. :arg_qty1);
  337. IF sqlca.SQLCode <> 0 THEN
  338. rslt = 0
  339. arg_msg = '因网络或其他原因,新增客户销售'+arg_mtrlcode+'价格失败,'+sqlca.SQLErrText
  340. GOTO ext
  341. END IF
  342. ELSEIF arg_buildtype = 2 THEN
  343. INSERT INTO u_cus_price
  344. (cusid,
  345. mtrlid,
  346. price_bj,
  347. fprice_bj,
  348. zqrate_bj,
  349. dscrp,
  350. status,
  351. woodcode,
  352. pcode,
  353. moneyid,
  354. sys_changetime,
  355. qty,
  356. qty1)
  357. VALUES
  358. (:arg_cusid,
  359. :arg_mtrlid,
  360. :arg_fprice * :arg_zqrate,
  361. :arg_fprice,
  362. :arg_zqrate,
  363. :arg_dscrp,
  364. :arg_status,
  365. :arg_woodcode,
  366. :arg_pcode,
  367. :arg_moneyid,
  368. getdate(),
  369. :arg_qty,
  370. :arg_qty1);
  371. IF sqlca.SQLCode <> 0 THEN
  372. rslt = 0
  373. arg_msg = '因网络或其他原因,新增客户销售'+arg_mtrlcode+'价格失败,'+sqlca.SQLErrText
  374. GOTO ext
  375. END IF
  376. END IF
  377. END IF
  378. //2.插入客户销售变动明细价表
  379. INSERT INTO u_cus_price_mx
  380. (
  381. u_cus_price_mx.cusid,
  382. u_cus_price_mx.mtrlid,
  383. u_cus_price_mx.opdate,
  384. u_cus_price_mx.opemp,
  385. u_cus_price_mx.outwareid,
  386. u_cus_price_mx.outwarecode,
  387. u_cus_price_mx.outdate,
  388. u_cus_price_mx.price,
  389. u_cus_price_mx.fprice,
  390. u_cus_price_mx.zqrate,
  391. u_cus_price_mx.cost,
  392. u_cus_price_mx.status,
  393. u_cus_price_mx.woodcode,
  394. u_cus_price_mx.pcode,
  395. u_cus_price_mx.dscrp,
  396. u_cus_price_mx.buildtype,
  397. u_cus_price_mx.printid,
  398. u_cus_price_mx.moneyid,
  399. u_cus_price_mx.qty,
  400. u_cus_price_mx.qty1
  401. )
  402. VALUES
  403. (
  404. :arg_cusid,
  405. :arg_mtrlid,
  406. getdate(),
  407. :publ_operator,
  408. :arg_outwareid,
  409. :arg_outwarecode,
  410. :arg_outdate,
  411. :arg_fprice* :arg_zqrate,
  412. :arg_fprice,
  413. :arg_zqrate,
  414. :arg_cost,
  415. :arg_status,
  416. :arg_woodcode,
  417. :arg_pcode,
  418. :arg_dscrp,
  419. :arg_flag,
  420. :arg_printid,
  421. :arg_moneyid,
  422. :arg_qty,
  423. :arg_qty1
  424. );
  425. IF sqlca.SQLCode <> 0 THEN
  426. rslt = 0
  427. arg_msg = '因网络或其他原因,登记在客户,'+arg_mtrlcode+'售价变动明细表失败,'+sqlca.SQLErrText
  428. GOTO ext
  429. END IF
  430. ext:
  431. IF rslt = 0 THEN
  432. ROLLBACK;
  433. ELSEIF arg_ifcommit And rslt = 1 THEN
  434. COMMIT;
  435. END IF
  436. RETURN rslt
  437. END Function
  438. public function integer uof_check_price_saletask (long arg_typeid, long arg_cusid, long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_woodcode, string arg_pcode, long arg_moneyid, long arg_scid, long arg_quoteid, long arg_quoteprintid, decimal arg_price, decimal arg_qty, ref string arg_msg);
  439. Decimal ld_lmsaleprice,ld_rebate
  440. String ls_cusname,ls_listname
  441. Long ll_pricelistid
  442. Int rslt = 1 //,li_flag
  443. Long cnt = 0
  444. Long ll_moneyid,ll_moneyid_pricelist
  445. s_mtrlcfg_expr s_pz[]
  446. Long ll_statusflag
  447. Long ll_i
  448. String ls_status_zj
  449. Decimal ld_price_zj,ld_rebate_zj,obj_price
  450. Long ll_row
  451. String ls_poexpr,ls_rtn,ls_mtrlcode
  452. String ls_price
  453. String ls_mtrlsectype,ls_zxmtrlmode,ls_usermtrlmode
  454. Int li_selecttype,li_price_ifpz
  455. uo_price_order uo_po
  456. uo_po = Create uo_price_order
  457. IF Not f_power_ind(492,sys_msg_pow) Or sys_power_issuper THEN
  458. rslt = 1
  459. GOTO ext
  460. END IF
  461. IF uo_option_checkprice_native = -1000 THEN
  462. rslt = 0
  463. arg_msg = '选项:[056]销售价按本位币限价,读取初始默认值失败,操作取消!'
  464. GOTO ext
  465. END IF
  466. //IF uo_option_price_if_status = -1000 THEN
  467. // rslt = 0
  468. // arg_msg = '选项:[021]销售价按颜色约束,读取初始默认值失败,操作取消!'
  469. // GOTO ext
  470. //END IF
  471. String ls_status_ori,ls_woodcode_ori,ls_pcode_ori
  472. ls_status_ori = arg_status
  473. ls_woodcode_ori = arg_woodcode
  474. ls_pcode_ori = arg_pcode
  475. SELECT selecttype INTO :li_selecttype
  476. FROM u_saletype
  477. Where typeid = :arg_typeid;
  478. IF sqlca.SQLCode <> 0 THEN
  479. rslt = 0
  480. arg_msg = '查询销售订单分类信息失败,'+sqlca.SQLErrText
  481. GOTO ext
  482. END IF
  483. SELECT statusflag,mtrlcode,mtrlsectype,zxmtrlmode,usermtrlmode,price_ifpz
  484. INTO :ll_statusflag,:ls_mtrlcode,:ls_mtrlsectype,:ls_zxmtrlmode,:ls_usermtrlmode,:li_price_ifpz
  485. FROM u_mtrldef
  486. Where mtrlid = :arg_mtrlid;
  487. IF sqlca.SQLCode <> 0 THEN
  488. rslt = 0
  489. GOTO ext
  490. END IF
  491. IF uo_option_checkprice_native = 1 THEN
  492. SELECT moneyid INTO :ll_moneyid
  493. FROM cw_currency
  494. Where native = 1;
  495. IF sqlca.SQLCode <> 0 THEN
  496. arg_msg = '查询本位币资料失败,可能本位币资料不存在,请检查'
  497. rslt = 0
  498. GOTO ext
  499. END IF
  500. ELSE
  501. ll_moneyid = arg_moneyid
  502. END IF
  503. Dec ld_rebate_cus
  504. SELECT name,pricelistid,rebate INTO :ls_cusname,:ll_pricelistid,:ld_rebate_cus
  505. FROM u_cust
  506. Where cusid = :arg_cusid;
  507. IF sqlca.SQLCode <> 0 THEN
  508. arg_msg = '查询客户资料失败,请检查'
  509. rslt = 0
  510. GOTO ext
  511. END IF
  512. /////// //检查价格指令
  513. datastore ds_price
  514. ds_price = uo_po.uof_getorderprice(arg_cusid, arg_mtrlid, arg_status, arg_woodcode, arg_pcode,arg_qty, arg_msg)
  515. ll_row = ds_price.RowCount()
  516. //////////////////// //
  517. IF ll_row = 0 THEN
  518. SELECT name,pricelistid INTO :ls_cusname,:ll_pricelistid
  519. FROM u_cust
  520. Where cusid = :arg_cusid;
  521. IF sqlca.SQLCode <> 0 THEN
  522. rslt = 0
  523. arg_msg = "查询操作失败,客户资料"
  524. GOTO ext
  525. END IF
  526. IF li_selecttype = 2 And ll_pricelistid = 0 THEN
  527. rslt = 0
  528. arg_msg = '销售订单分类设为"只能选客户价格表",但当前客户没有指定价格表,请检查'
  529. GOTO ext
  530. END IF
  531. IF arg_quoteid = 0 THEN
  532. IF li_selecttype = 1 THEN //只能选择报价历史
  533. SELECT top 1 u_cus_price.fprice_bj,u_cus_price.zqrate_bj
  534. INTO :ld_lmsaleprice,:ld_rebate
  535. FROM u_cus_price
  536. WHERE ( u_cus_price.cusid = :arg_cusid ) AND
  537. ( u_cus_price.mtrlid = :arg_mtrlid ) AND
  538. ( u_cus_price.status = :arg_status ) AND
  539. ( u_cus_price.pcode = :arg_pcode ) AND
  540. ( u_cus_price.woodcode = :arg_woodcode )
  541. AND ( (u_cus_price.qty = 0 OR u_cus_price.qty <= :arg_qty)
  542. AND (u_cus_price.qty1 = 0 OR u_cus_price.qty1 >= :arg_qty)) AND
  543. ( u_cus_price.moneyid = :arg_moneyid)
  544. Order By sys_changetime Desc;
  545. IF sqlca.SQLCode <> 0 THEN
  546. rslt = 0
  547. arg_msg = "查询产品:"+arg_mtrlcode+" 最新报价失败 " +sqlca.SQLErrText
  548. GOTO ext
  549. END IF
  550. IF arg_price < ld_lmsaleprice THEN
  551. rslt = 0
  552. arg_msg = '客户:'+ls_cusname+',产品:'+arg_mtrlcode+'销售单价{'+String(arg_price,'#,##0.00##')+'} 低于销售限价{'+String(ld_lmsaleprice,'#,##0.00##')+'}'
  553. GOTO ext
  554. END IF
  555. ELSE
  556. IF ll_statusflag = 2 And arg_status <> '' THEN
  557. //组合配置 ,计算价格
  558. IF uf_cmpl_price_zhpz(arg_mtrlid, arg_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid, ll_moneyid, ld_rebate_cus, obj_price, ld_rebate, arg_msg) = 0 THEN
  559. rslt = 0
  560. GOTO ext
  561. END IF
  562. IF arg_price < obj_price THEN
  563. rslt = 0
  564. arg_msg = '客户:'+ls_cusname+',产品:'+arg_mtrlcode+'销售单价{'+String(arg_price * ld_rebate,'#,##0.00##')+'} 低于销售限价{'+String(obj_price,'#,##0.00##')+'}'
  565. GOTO ext
  566. END IF
  567. ELSE
  568. //非组合配置, 查询价格
  569. IF uf_cmpl_price(arg_mtrlid, arg_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid, ll_moneyid, ld_rebate_cus, li_price_ifpz, obj_price, ld_rebate, arg_msg) = 0 THEN
  570. rslt = 0
  571. GOTO ext
  572. END IF
  573. IF arg_price < obj_price * ld_rebate THEN
  574. rslt = 0
  575. arg_msg = '客户:'+ls_cusname+',产品:'+arg_mtrlcode+'销售单价{'+String(arg_price * ld_rebate,'#,##0.00##')+'} 低于销售限价{'+String(obj_price,'#,##0.00##')+'}'
  576. GOTO ext
  577. END IF
  578. END IF
  579. END IF
  580. ELSE
  581. SELECT u_quotemx.sumprice_1
  582. INTO :ld_lmsaleprice
  583. FROM u_quotemx
  584. WHERE scid = :arg_scid
  585. AND quoteid = :arg_quoteid
  586. And printid = :arg_quoteprintid;
  587. IF sqlca.SQLCode <> 0 THEN
  588. rslt = 0
  589. arg_msg = '查询产品:'+arg_mtrlcode+'报价单报价失败,'+sqlca.SQLErrText
  590. GOTO ext
  591. END IF
  592. IF arg_price < ld_lmsaleprice THEN
  593. rslt = 0
  594. arg_msg = '客户:'+ls_cusname+',产品:'+arg_mtrlcode+'销售单价{'+String(arg_price,'#,##0.00##')+'} 低于报价单报价{'+String(ld_lmsaleprice,'#,##0.00##')+'}'
  595. GOTO ext
  596. END IF
  597. END IF
  598. ELSE
  599. ls_poexpr = ds_price.Object.poexpr[1]
  600. ls_price = String(arg_price,'###0.##########')
  601. SELECT Top 1 Replace( :ls_poexpr,'目标价',:ls_price) Into :ls_poexpr From u_user;
  602. IF Pos(ls_poexpr,'{') > 0 And Pos(ls_poexpr,'}') > 0 THEN
  603. ll_pricelistid = Long(Mid(ls_poexpr,Pos(ls_poexpr,'[') + 1,Pos(ls_poexpr,']') - Pos(ls_poexpr,'[') - 1))
  604. IF ll_statusflag = 2 And arg_status <> '' THEN
  605. //组合配置 ,计算价格
  606. IF uf_cmpl_price_zhpz(arg_mtrlid, arg_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid, ll_moneyid, ld_rebate_cus, obj_price, ld_rebate, arg_msg) = 0 THEN
  607. rslt = 0
  608. GOTO ext
  609. END IF
  610. ELSE
  611. //非组合配置, 查询价格
  612. IF uf_cmpl_price(arg_mtrlid, arg_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid, ll_moneyid, ld_rebate_cus, li_price_ifpz, obj_price, ld_rebate, arg_msg) = 0 THEN
  613. rslt = 0
  614. GOTO ext
  615. END IF
  616. obj_price = obj_price * ld_rebate
  617. END IF
  618. ls_poexpr = Replace(ls_poexpr,Pos(ls_poexpr,'{'),Pos(ls_poexpr,'}') - Pos(ls_poexpr,'{') + 1,String(obj_price,'###0.00########'))
  619. END IF
  620. datastore dw_price_check
  621. dw_price_check = Create datastore
  622. dw_price_check.DataObject = 'dw_compute_priceorder'
  623. dw_price_check.InsertRow(0)
  624. dw_price_check.Modify("compute.expression='"+ls_poexpr+"'")
  625. ls_rtn = String(dw_price_check.Object.compute[ll_row])
  626. IF ls_rtn = 'false' THEN
  627. rslt = 0
  628. arg_msg = '产品:'+ls_mtrlcode+'销售价格受到价格指令限制,不能通过{'+ls_poexpr+'}'
  629. GOTO ext
  630. END IF
  631. END IF
  632. ext:
  633. Destroy uo_po
  634. RETURN rslt
  635. end function
  636. public function integer uof_check_price (long arg_cusid, long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_pcode, string arg_woodcode, long arg_moneyid, decimal arg_price, decimal arg_qty, ref string arg_msg);
  637. Decimal ld_lmsaleprice,ld_rebate
  638. String ls_cusname,ls_listname
  639. Long ll_pricelistid
  640. Int rslt = 1//,li_flag
  641. Long cnt = 0
  642. Long ll_moneyid,ll_moneyid_pricelist
  643. s_mtrlcfg_expr s_pz[]
  644. Long ll_statusflag
  645. Long ll_i
  646. String ls_status_zj
  647. Decimal ld_price_zj,ld_rebate_zj,obj_price
  648. Long ll_row
  649. String ls_poexpr,ls_rtn,ls_mtrlcode
  650. String ls_price
  651. String ls_mtrlsectype,ls_zxmtrlmode,ls_usermtrlmode
  652. Int li_price_ifpz
  653. uo_price_order uo_po
  654. uo_po = Create uo_price_order
  655. IF Not f_power_ind(492,sys_msg_pow) Or sys_power_issuper THEN
  656. rslt = 1
  657. GOTO ext
  658. END IF
  659. IF uo_option_checkprice_native = -1000 THEN
  660. rslt = 0
  661. arg_msg = '选项:[056]销售价按本位币限价,读取初始默认值失败,操作取消!'
  662. GOTO ext
  663. END IF
  664. //IF uo_option_price_if_status = -1000 THEN
  665. // rslt = 0
  666. // arg_msg = '选项:[021]销售价按颜色约束,读取初始默认值失败,操作取消!'
  667. // GOTO ext
  668. //END IF
  669. String ls_status_ori,ls_woodcode_ori,ls_pcode_ori
  670. ls_status_ori = arg_status
  671. ls_woodcode_ori = arg_woodcode
  672. ls_pcode_ori = arg_pcode
  673. SELECT statusflag,mtrlcode,mtrlsectype,zxmtrlmode,usermtrlmode ,price_ifpz
  674. INTO :ll_statusflag,:ls_mtrlcode,:ls_mtrlsectype,:ls_zxmtrlmode,:ls_usermtrlmode ,:li_price_ifpz
  675. FROM u_mtrldef
  676. Where mtrlid = :arg_mtrlid;
  677. IF sqlca.SQLCode <> 0 THEN
  678. rslt = 0
  679. GOTO ext
  680. END IF
  681. IF uo_option_checkprice_native = 1 THEN
  682. SELECT moneyid INTO :ll_moneyid
  683. FROM cw_currency
  684. Where native = 1;
  685. IF sqlca.SQLCode <> 0 THEN
  686. arg_msg = '查询本位币资料失败,可能本位币资料不存在,请检查'
  687. rslt = 0
  688. GOTO ext
  689. END IF
  690. ELSE
  691. ll_moneyid = arg_moneyid
  692. END IF
  693. decimal ld_rebate_cus
  694. SELECT name,pricelistid,rebate INTO :ls_cusname,:ll_pricelistid,:ld_rebate_cus
  695. FROM u_cust
  696. Where cusid = :arg_cusid;
  697. IF sqlca.SQLCode <> 0 THEN
  698. arg_msg = '查询客户资料失败,请检查'
  699. rslt = 0
  700. GOTO ext
  701. END IF
  702. /////// //检查价格指令
  703. datastore ds_price
  704. ds_price = uo_po.uof_getorderprice(arg_cusid, arg_mtrlid, arg_status, arg_woodcode, arg_pcode,arg_qty, arg_msg)
  705. ll_row = ds_price.RowCount()
  706. //////////////////// //
  707. IF ll_row = 0 THEN //没有价格指令 , 按价格表检查
  708. SELECT name,pricelistid INTO :ls_cusname,:ll_pricelistid
  709. FROM u_cust
  710. Where cusid = :arg_cusid;
  711. IF sqlca.SQLCode <> 0 THEN
  712. rslt = 0
  713. arg_msg = "查询操作失败,客户资料"
  714. GOTO ext
  715. END IF
  716. IF ll_statusflag = 2 And arg_status <> '' THEN
  717. //组合配置 ,计算价格
  718. IF uf_cmpl_price_zhpz(arg_mtrlid, arg_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid, ll_moneyid, ld_rebate_cus, obj_price, ld_rebate, arg_msg) = 0 THEN
  719. rslt = 0
  720. GOTO ext
  721. END IF
  722. IF arg_price < obj_price THEN
  723. rslt = 0
  724. arg_msg = '客户:'+ls_cusname+',产品:'+arg_mtrlcode+'销售单价{'+String(arg_price * ld_rebate,'#,##0.00##')+'} 低于销售限价{'+String(obj_price,'#,##0.00##')+'}'
  725. GOTO ext
  726. END IF
  727. // f_checkpz(arg_status,s_pz[])
  728. // arg_pcode = ''
  729. // arg_woodcode = ''
  730. // obj_price = 0
  731. // FOR ll_i = 1 To UpperBound(s_pz)
  732. // ls_status_zj = s_pz[ll_i].cfgname
  733. // ld_price_zj = 0
  734. // ld_rebate_zj = 0
  735. //
  736. // //取价格表 内容
  737. // IF uof_get_pricelist_price(arg_mtrlid, arg_mtrlcode, ls_status_zj, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid, ll_moneyid, ld_lmsaleprice, li_flag, ls_listname, ld_rebate, arg_msg) = 0 THEN
  738. // rslt = 0
  739. // GOTO ext
  740. // END IF
  741. //
  742. //
  743. // obj_price = obj_price + ld_lmsaleprice * ld_rebate * Dec(s_pz[ll_i].qty)
  744. // NEXT
  745. // IF arg_price < obj_price THEN
  746. // rslt = 0
  747. // arg_msg = '客户:'+ls_cusname+',产品:'+arg_mtrlcode+'销售单价{'+String(arg_price * ld_rebate,'#,##0.00##')+'} 低于销售限价{'+String(obj_price,'#,##0.00##')+'}'
  748. // GOTO ext
  749. // END IF
  750. ELSE
  751. //非组合配置, 查询价格
  752. IF uf_cmpl_price(arg_mtrlid, arg_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid, ll_moneyid, ld_rebate_cus, li_price_ifpz, obj_price, ld_rebate, arg_msg) = 0 THEN
  753. rslt = 0
  754. GOTO ext
  755. END IF
  756. IF arg_price < obj_price * ld_rebate THEN
  757. rslt = 0
  758. arg_msg = '客户:'+ls_cusname+',产品:'+arg_mtrlcode+'销售单价{'+String(arg_price * ld_rebate,'#,##0.00##')+'} 低于销售限价{'+String(obj_price,'#,##0.00##')+'}'
  759. GOTO ext
  760. END IF
  761. // CHOOSE CASE li_price_ifpz
  762. // CASE 0
  763. // arg_status = ''
  764. // arg_woodcode = ''
  765. // arg_pcode = ''
  766. // CASE 1
  767. // arg_pcode = ''
  768. // arg_woodcode = ''
  769. // CASE 2
  770. // arg_status = ''
  771. // arg_pcode = ''
  772. // CASE 3
  773. // arg_status = ''
  774. // arg_woodcode = ''
  775. // CASE 4
  776. // arg_pcode = ''
  777. // CASE 5
  778. // arg_status = ''
  779. // CASE 6
  780. // arg_woodcode = ''
  781. // END CHOOSE
  782. //
  783. // //取价格表 内容
  784. // IF uof_get_pricelist_price(arg_mtrlid, arg_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid, ll_moneyid, ld_lmsaleprice, li_flag, ls_listname, ld_rebate, arg_msg) = 0 THEN
  785. // rslt = 0
  786. // GOTO ext
  787. // END IF
  788. //
  789. // IF arg_price < ld_lmsaleprice * ld_rebate THEN
  790. // rslt = 0
  791. // arg_msg = '客户:'+ls_cusname+',产品:'+arg_mtrlcode+'销售单价{'+String(arg_price * ld_rebate,'#,##0.00##')+'} 低于销售限价{'+String(ld_lmsaleprice,'#,##0.00##')+'}'
  792. // GOTO ext
  793. // END IF
  794. END IF
  795. ELSE //有价格指令, 按指令检测
  796. ls_poexpr = ds_price.Object.poexpr[1]
  797. ls_price = String(arg_price,'###0.##########')
  798. SELECT Top 1 Replace( :ls_poexpr,'目标价',:ls_price) Into :ls_poexpr From u_user;
  799. IF Pos(ls_poexpr,'{') > 0 And Pos(ls_poexpr,'}') > 0 THEN
  800. ll_pricelistid = Long(Mid(ls_poexpr,Pos(ls_poexpr,'[') + 1,Pos(ls_poexpr,']') - Pos(ls_poexpr,'[') - 1))
  801. IF ll_statusflag = 2 And arg_status <> '' THEN
  802. //组合配置 ,计算价格
  803. IF uf_cmpl_price_zhpz(arg_mtrlid, arg_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid, ll_moneyid, ld_rebate_cus, obj_price, ld_rebate, arg_msg) = 0 THEN
  804. rslt = 0
  805. GOTO ext
  806. END IF
  807. // f_checkpz(arg_status,s_pz[])
  808. // arg_pcode = ''
  809. // arg_woodcode = ''
  810. // obj_price = 0
  811. // FOR ll_i = 1 To UpperBound(s_pz)
  812. // ls_status_zj = s_pz[ll_i].cfgname
  813. // ld_price_zj = 0
  814. // ld_rebate_zj = 0
  815. //
  816. // //取价格表 内容
  817. // IF uof_get_pricelist_price(arg_mtrlid, arg_mtrlcode, ls_status_zj, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid, ll_moneyid, ld_lmsaleprice, li_flag, ls_listname, ld_rebate, arg_msg) = 0 THEN
  818. // rslt = 0
  819. // GOTO ext
  820. // END IF
  821. //
  822. // obj_price = obj_price + ld_lmsaleprice * ld_rebate * Dec(s_pz[ll_i].qty)
  823. // NEXT
  824. ELSE
  825. //非组合配置, 查询价格
  826. IF uf_cmpl_price(arg_mtrlid, arg_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid, ll_moneyid, ld_rebate_cus, li_price_ifpz, obj_price, ld_rebate, arg_msg) = 0 THEN
  827. rslt = 0
  828. GOTO ext
  829. END IF
  830. obj_price = obj_price * ld_rebate
  831. // CHOOSE CASE li_price_ifpz
  832. // CASE 0
  833. // arg_status = ''
  834. // arg_woodcode = ''
  835. // arg_pcode = ''
  836. // CASE 1
  837. // arg_pcode = ''
  838. // arg_woodcode = ''
  839. // CASE 2
  840. // arg_status = ''
  841. // arg_pcode = ''
  842. // CASE 3
  843. // arg_status = ''
  844. // arg_woodcode = ''
  845. // CASE 4
  846. // arg_pcode = ''
  847. // CASE 5
  848. // arg_status = ''
  849. // CASE 6
  850. // arg_woodcode = ''
  851. // END CHOOSE
  852. //
  853. // //取价格表 内容
  854. // IF uof_get_pricelist_price(arg_mtrlid, arg_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid, ll_moneyid, ld_lmsaleprice, li_flag, ls_listname, ld_rebate, arg_msg) = 0 THEN
  855. // rslt = 0
  856. // GOTO ext
  857. // END IF
  858. //
  859. // obj_price = ld_lmsaleprice * ld_rebate
  860. END IF
  861. ls_poexpr = Replace(ls_poexpr,Pos(ls_poexpr,'{'),Pos(ls_poexpr,'}') - Pos(ls_poexpr,'{') + 1,String(obj_price,'###0.00########'))
  862. END IF
  863. datastore dw_price_check
  864. dw_price_check = Create datastore
  865. dw_price_check.DataObject = 'dw_compute_priceorder'
  866. dw_price_check.InsertRow(0)
  867. dw_price_check.Modify("compute.expression='"+ls_poexpr+"'")
  868. ls_rtn = String(dw_price_check.Object.compute[ll_row])
  869. IF ls_rtn = 'false' THEN
  870. rslt = 0
  871. arg_msg = '产品:'+ls_mtrlcode+'销售价格受到价格指令限制,不能通过{'+ls_poexpr+'}'
  872. GOTO ext
  873. END IF
  874. END IF
  875. ext:
  876. Destroy uo_po
  877. RETURN rslt
  878. end function
  879. public function integer uof_getmtrlcusprice (long arg_moneyid, long arg_mtrlid, long arg_cusid, ref decimal arg_price, ref decimal arg_zqrate, string arg_status, string arg_woodcode, string arg_pcode, decimal arg_qty, ref string arg_msg);
  880. Int rslt = 1
  881. Long cnt = 0
  882. Long count = 1
  883. Decimal rtn_price,rtn_zqrate
  884. s_mtrlcfg_expr s_pz[]
  885. DateTime server_time
  886. String ls_cusname,ls_listname
  887. Long ll_moneyid,ll_moneyid_pricelist
  888. Long ll_pricelistid
  889. Decimal ld_lmsaleprice,ld_rebate
  890. //Int li_flag
  891. Long ll_i
  892. String ls_status_zj
  893. Decimal ld_price_zj,ld_rebate_zj
  894. Decimal obj_price
  895. Long ll_row
  896. String ls_poexpr,ls_rtn,ls_mtrlcode
  897. String ls_price,ls_objprice
  898. String ls_mtrlsectype,ls_zxmtrlmode,ls_usermtrlmode
  899. Long ll_kind
  900. String ls_pricestr
  901. Int li_rslt_cmp
  902. Decimal ld_rebate_cus
  903. Decimal ld_price_cmp
  904. uo_price_order uo_po
  905. uo_po = Create uo_price_order
  906. IF uo_option_checkprice_native = -1000 THEN
  907. rslt = 0
  908. arg_msg = '选项:[056]销售价按本位币限价,读取初始默认值失败,操作取消!'
  909. GOTO ext
  910. END IF
  911. IF uo_option_saleprice_list_rebate = -1000 THEN
  912. rslt = 0
  913. arg_msg = '选项:[237]客户价格表折扣按客户设定,读取初始默认值失败,操作取消!'
  914. GOTO ext
  915. END IF
  916. String ls_status_ori,ls_woodcode_ori,ls_pcode_ori
  917. ls_status_ori = arg_status
  918. ls_woodcode_ori = arg_woodcode
  919. ls_pcode_ori = arg_pcode
  920. Long ll_statusflag
  921. Int li_price_ifpz
  922. SELECT statusflag,mtrlsectype,zxmtrlmode,usermtrlmode,mtrlcode,price_ifpz
  923. INTO :ll_statusflag,:ls_mtrlsectype,:ls_zxmtrlmode,:ls_usermtrlmode,:ls_mtrlcode,:li_price_ifpz
  924. FROM u_mtrldef
  925. Where mtrlid = :arg_mtrlid;
  926. IF sqlca.SQLCode <> 0 THEN
  927. rslt = 0
  928. GOTO ext
  929. END IF
  930. IF uo_option_checkprice_native = 1 THEN
  931. SELECT moneyid INTO :ll_moneyid
  932. FROM cw_currency
  933. Where native = 1;
  934. IF sqlca.SQLCode <> 0 THEN
  935. arg_msg = '查询本位币资料失败,可能本位币资料不存在,请检查'
  936. rslt = 0
  937. GOTO ext
  938. END IF
  939. ELSE
  940. ll_moneyid = arg_moneyid
  941. END IF
  942. //价格指令的在单据上再检查,这里不考虑
  943. SELECT name,pricelistid,rebate INTO :ls_cusname,:ll_pricelistid,:ld_rebate_cus
  944. FROM u_cust
  945. Where cusid = :arg_cusid;
  946. IF sqlca.SQLCode <> 0 THEN
  947. rslt = 2
  948. rtn_price = 0.00
  949. rtn_zqrate = 1
  950. GOTO ext
  951. END IF
  952. IF ll_statusflag = 2 And arg_status <> '' THEN
  953. //组合配置 ,计算价格
  954. IF uf_cmpl_price_zhpz(arg_mtrlid, ls_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid, ll_moneyid, ld_rebate_cus, obj_price, ld_rebate, arg_msg) = 0 THEN
  955. rslt = 2
  956. rtn_price = 0.00
  957. rtn_zqrate = 1
  958. GOTO ext
  959. END IF
  960. rtn_price = obj_price
  961. rtn_zqrate = ld_rebate
  962. ELSE
  963. //非组合配置 ,计算价格
  964. IF uf_cmpl_price(arg_mtrlid, ls_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid, ll_moneyid, ld_rebate_cus, li_price_ifpz, obj_price, ld_rebate, arg_msg) = 0 THEN
  965. rslt = 2
  966. rtn_price = 0.00
  967. rtn_zqrate = 1
  968. GOTO ext
  969. END IF
  970. rtn_price = obj_price
  971. rtn_zqrate = ld_rebate
  972. END IF
  973. ext:
  974. arg_price = rtn_price
  975. arg_zqrate = rtn_zqrate
  976. Destroy uo_po
  977. RETURN rslt
  978. end function
  979. public function integer uof_getprice_saletask (long arg_moneyid, long arg_cusid, long arg_mtrlid, string arg_status, string arg_woodcode, string arg_pcode, decimal arg_qty, long arg_scid, long arg_quoteid, long arg_quoteprintid, integer arg_typeid, ref decimal arg_price, ref decimal arg_rebate, ref string arg_msg);
  980. //产品价格表公式与产品价格策略的限制
  981. //1.产品价格策略已设置限制的配置不能应用于价格表公式;
  982. //例如:产品价格策略 选择为 不使用 ; 则价格表公式可以用 配置 配置1, 配置2 设置公式;
  983. // 产品价格策略 选择为 配置 ; 则价格表公式不能是用 配置 , 但可以用 配置1, 配置2 设置公式;
  984. // 产品价格策略 选择为 配置 + 配置1; 则价格表公式不能是用 配置 或 配置1 , 但可以用 配置2 设置公式;
  985. // 产品价格策略 选择为 配置 + 配置1 + 配置3; 则价格表公式不能使用;
  986. Int rslt = 1
  987. Long ll_statusflag,li_price_ifpz
  988. String ls_mtrlcode
  989. String ls_cusname
  990. Long ll_pricelistid,ll_pricelistid_arr[],ll_mxbt = 0,ll_pricelistid_tmp
  991. Decimal ld_lmsaleprice,ld_rebate,obj_price,ld_rebate_arr[],ld_rebate_tmp
  992. Long ll_i
  993. String ls_status_zj
  994. //Int li_flag
  995. String ls_listname
  996. Decimal ld_rebate_cus
  997. Decimal rtn_price,rtn_zqrate
  998. Int li_selecttype, li_hispriceflag
  999. Int li_suc = 0
  1000. Int li_ifpackpro,li_ifpricepack
  1001. Long ll_moneyid_native
  1002. Decimal lde_difprice
  1003. s_mtrlcfg_expr s_pz[]
  1004. IF uo_option_saleprice_list_rebate = -1000 THEN
  1005. rslt = 0
  1006. arg_msg = '选项:[237]客户价格表折扣按客户设定,读取初始默认值失败,操作取消!'
  1007. GOTO ext
  1008. END IF
  1009. IF uo_option_price_rmb = -1000 THEN
  1010. rslt = 0
  1011. arg_msg = '选项:[238]销售单价按人民币单价折算,读取初始默认值失败,操作取消!'
  1012. GOTO ext
  1013. END IF
  1014. String ls_status_ori,ls_woodcode_ori,ls_pcode_ori
  1015. ls_status_ori = arg_status
  1016. ls_woodcode_ori = arg_woodcode
  1017. ls_pcode_ori = arg_pcode
  1018. //yyx2012-12-11
  1019. IF uo_option_price_rmb = 1 THEN
  1020. SELECT moneyid INTO :ll_moneyid_native
  1021. From cw_currency Where native = 1;
  1022. IF sqlca.SQLCode <> 0 THEN
  1023. arg_msg = '查询本位币种失败,请检查币种是否设置了本位币'
  1024. rslt = 0
  1025. GOTO ext
  1026. END IF
  1027. arg_moneyid = ll_moneyid_native
  1028. END IF
  1029. //
  1030. IF f_get_selecttype(arg_typeid,arg_cusid,li_selecttype,arg_msg) = 0 THEN
  1031. rslt = 0
  1032. GOTO ext
  1033. END IF
  1034. SELECT hispriceflag INTO :li_hispriceflag
  1035. FROM u_saletype
  1036. Where typeid = :arg_typeid;
  1037. IF sqlca.SQLCode <> 0 THEN
  1038. rslt = 0
  1039. arg_msg = '查询销售订单分类选择限制属性失败,'+sqlca.SQLErrText
  1040. GOTO ext
  1041. END IF
  1042. SELECT statusflag,mtrlcode,price_ifpz,ifpackpro,ifpricepack
  1043. INTO :ll_statusflag,:ls_mtrlcode,:li_price_ifpz,:li_ifpackpro,:li_ifpricepack
  1044. FROM u_mtrldef
  1045. Where mtrlid = :arg_mtrlid;
  1046. IF sqlca.SQLCode <> 0 THEN
  1047. rslt = 0
  1048. GOTO ext
  1049. END IF
  1050. SELECT name,pricelistid,rebate
  1051. INTO :ls_cusname,:ll_pricelistid,:ld_rebate_cus
  1052. FROM u_cust
  1053. Where cusid = :arg_cusid;
  1054. IF sqlca.SQLCode <> 0 THEN
  1055. rslt = 0
  1056. arg_msg = "查询操作失败,客户资料"
  1057. GOTO ext
  1058. END IF
  1059. ll_mxbt = 1
  1060. ll_pricelistid_arr[ll_mxbt] = ll_pricelistid
  1061. ld_rebate_arr[ll_mxbt] = ld_rebate_cus
  1062. DECLARE cur_listmx CURSOR FOR
  1063. SELECT pricelistid,rebate
  1064. FROM u_cus_pricelist_mx
  1065. WHERE cusid = :arg_cusid
  1066. Order By printid;
  1067. OPEN cur_listmx;
  1068. FETCH cur_listmx Into :ll_pricelistid_tmp,:ld_rebate_tmp;
  1069. DO WHILE sqlca.SQLCode = 0
  1070. ll_mxbt++
  1071. ll_pricelistid_arr[ll_mxbt] = ll_pricelistid_tmp
  1072. ld_rebate_arr[ll_mxbt] = ld_rebate_tmp
  1073. FETCH cur_listmx Into :ll_pricelistid_tmp,:ld_rebate_tmp;
  1074. LOOP
  1075. CLOSE cur_listmx;
  1076. IF li_selecttype = 2 And ll_pricelistid = 0 THEN
  1077. rslt = 0
  1078. arg_msg = '选择限制为"只能选客户价格表",但当前客户没有指定价格表,请检查'
  1079. GOTO ext
  1080. END IF
  1081. IF arg_quoteid > 0 THEN //选择报价单
  1082. SELECT u_quotemx.sumprice_1,
  1083. u_quotemx.rebate
  1084. INTO :ld_lmsaleprice,
  1085. :ld_rebate
  1086. FROM u_quotemx
  1087. WHERE scid = :arg_scid
  1088. AND quoteid = :arg_quoteid
  1089. And printid = :arg_quoteprintid;
  1090. IF sqlca.SQLCode <> 0 THEN
  1091. rslt = 0
  1092. arg_msg = '查询产品:'+ls_mtrlcode+'报价单报价失败,'+sqlca.SQLErrText
  1093. GOTO ext
  1094. END IF
  1095. rtn_price = ld_lmsaleprice
  1096. rtn_zqrate = ld_rebate
  1097. ELSE
  1098. IF li_selecttype = 1 THEN //只能选择报价历史
  1099. SELECT top 1 u_cus_price.fprice_bj,u_cus_price.zqrate_bj
  1100. INTO :ld_lmsaleprice,:ld_rebate
  1101. FROM u_cus_price
  1102. WHERE ( u_cus_price.cusid = :arg_cusid ) AND
  1103. ( u_cus_price.mtrlid = :arg_mtrlid ) AND
  1104. ( u_cus_price.status = :arg_status ) AND
  1105. ( u_cus_price.pcode = :arg_pcode ) AND
  1106. ( u_cus_price.woodcode = :arg_woodcode )
  1107. AND ( (u_cus_price.qty = 0 OR u_cus_price.qty <= :arg_qty)
  1108. AND (u_cus_price.qty1 = 0 OR u_cus_price.qty1 >= :arg_qty))
  1109. AND ( u_cus_price.moneyid = :arg_moneyid)
  1110. AND ( u_cus_price.ifcancel = 0 )
  1111. Order By sys_changetime Desc;
  1112. IF sqlca.SQLCode <> 0 THEN
  1113. rslt = 0
  1114. arg_msg = "查询产品:"+ls_mtrlcode+" 最新报价失败 " +sqlca.SQLErrText
  1115. GOTO ext
  1116. END IF
  1117. rtn_price = ld_lmsaleprice
  1118. rtn_zqrate = ld_rebate
  1119. ELSE
  1120. If (li_selecttype = 0 Or li_selecttype = 2) And li_hispriceflag = 1 THEN //取客户最新销售价
  1121. SELECT top 1 u_cus_price.fprice,u_cus_price.zqrate
  1122. INTO :ld_lmsaleprice,:ld_rebate
  1123. FROM u_cus_price
  1124. WHERE ( u_cus_price.cusid = :arg_cusid ) AND
  1125. ( u_cus_price.mtrlid = :arg_mtrlid ) AND
  1126. ( u_cus_price.status = :arg_status ) AND
  1127. ( u_cus_price.pcode = :arg_pcode ) AND
  1128. ( u_cus_price.woodcode = :arg_woodcode )
  1129. AND ( (u_cus_price.qty = 0 OR u_cus_price.qty <= :arg_qty)
  1130. AND (u_cus_price.qty1 = 0 OR u_cus_price.qty1 >= :arg_qty))
  1131. AND ( u_cus_price.moneyid = :arg_moneyid)
  1132. Order By sys_changetime Desc;
  1133. IF sqlca.SQLCode <> 0 THEN
  1134. ld_lmsaleprice = 0
  1135. ld_rebate = 0
  1136. END IF
  1137. rtn_price = ld_lmsaleprice
  1138. rtn_zqrate = ld_rebate
  1139. ELSE //选价格表: 1.组合配置产品按组合计算; 2.包件产品按子件计算; 3.其他常规产品直接取价
  1140. FOR ll_i = 1 To ll_mxbt //循环所有该客户有效价格表
  1141. IF ll_statusflag = 2 And arg_status <> '' And li_ifpricepack = 0 THEN //组合配置且非整套计算
  1142. //组合配置 ,计算价格
  1143. //如果不按整套,分开子件查价格
  1144. //如果价格按整套,则用整个配置信息查价格
  1145. IF uf_cmpl_price_zhpz(arg_mtrlid, ls_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid_arr[ll_i], arg_moneyid, ld_rebate_arr[ll_i], obj_price, ld_rebate, arg_msg) = 0 THEN
  1146. CONTINUE
  1147. ELSE
  1148. rtn_price = obj_price
  1149. rtn_zqrate = ld_rebate
  1150. li_suc = 1
  1151. EXIT
  1152. END IF
  1153. ELSEIF li_ifpackpro <> 0 And li_ifpricepack = 0 THEN //包件产品且非整套计算
  1154. //2.包件产品,按清单拆分, 取子件价格汇总作为包件价格
  1155. IF uf_cmpl_price_pack(arg_mtrlid, ls_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid_arr[ll_i], arg_moneyid, ld_rebate_arr[ll_i], li_price_ifpz, obj_price, ld_rebate, arg_msg) = 0 THEN
  1156. CONTINUE
  1157. ELSE
  1158. rtn_price = obj_price
  1159. rtn_zqrate = ld_rebate
  1160. li_suc = 1
  1161. EXIT
  1162. END IF
  1163. ELSE //整套计算 or 其他常规取价
  1164. //1.整套计算单价的
  1165. //2.非组合配置的
  1166. //3.非包件产品的
  1167. IF uf_cmpl_price(arg_mtrlid, ls_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid_arr[ll_i], arg_moneyid, ld_rebate_arr[ll_i], li_price_ifpz, obj_price, ld_rebate, arg_msg) = 0 THEN
  1168. CONTINUE
  1169. ELSE
  1170. rtn_price = obj_price
  1171. rtn_zqrate = ld_rebate
  1172. li_suc = 1
  1173. EXIT
  1174. END IF
  1175. END IF
  1176. NEXT
  1177. //if li_suc = 1 取价成功, 统计部件选配自动换料计算差价
  1178. IF li_suc = 1 THEN
  1179. IF uof_get_mtrl_3pz_difprice(arg_mtrlid, arg_status, arg_woodcode, arg_pcode, lde_difprice, arg_msg) = 0 THEN
  1180. lde_difprice = 0
  1181. END IF
  1182. rtn_price = rtn_price + lde_difprice
  1183. // rtn_zqrate = ld_rebate
  1184. // li_suc = 1
  1185. END IF
  1186. IF li_suc = 0 THEN
  1187. rslt = 0
  1188. GOTO ext
  1189. END IF
  1190. END IF
  1191. END IF
  1192. END IF
  1193. ext:
  1194. arg_price = rtn_price
  1195. arg_rebate = rtn_zqrate
  1196. RETURN rslt
  1197. end function
  1198. public function integer uof_get_pricelistid (long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_woodcode, string arg_pcode, decimal arg_qty, long arg_moneyid, ref long arg_pricelistid, ref string arg_msg);
  1199. //取可用价格表,或检查价格表币种
  1200. Int rslt = 1
  1201. Long ll_moneyid_pricelist
  1202. IF arg_pricelistid = 0 THEN
  1203. SELECT u_sale_price_list.pricelistid INTO :arg_pricelistid
  1204. FROM u_sale_price_list,u_sale_price_mx
  1205. WHERE u_sale_price_mx.pricelistid = u_sale_price_list.pricelistid
  1206. AND u_sale_price_mx.mtrlid = :arg_mtrlid
  1207. AND u_sale_price_mx.status = :arg_status
  1208. AND u_sale_price_mx.pcode = :arg_pcode
  1209. AND u_sale_price_mx.woodcode = :arg_woodcode
  1210. AND ( (u_sale_price_mx.saleqty = 0 OR u_sale_price_mx.saleqty <= :arg_qty)
  1211. AND (u_sale_price_mx.saleqty1 = 0 OR u_sale_price_mx.saleqty1 >= :arg_qty))
  1212. AND u_sale_price_list.moneyid = :arg_moneyid
  1213. And u_sale_price_list.dftflag = 1;
  1214. IF sqlca.SQLCode = 0 THEN
  1215. IF sqlca.SQLNRows = 0 THEN
  1216. rslt = 0
  1217. arg_msg = "产品:"+arg_mtrlcode+",配置:"+arg_status+",标准价格表未设定"
  1218. GOTO ext
  1219. ELSEIF sqlca.SQLNRows > 1 THEN
  1220. rslt = 0
  1221. arg_msg = "产品:"+arg_mtrlcode+",配置:"+arg_status+",有多于两个标准价格表"
  1222. GOTO ext
  1223. END IF
  1224. ELSE
  1225. rslt = 0
  1226. arg_msg = "查询产品:"+arg_mtrlcode+",配置:"+arg_status+",标准价格表操作失败"
  1227. GOTO ext
  1228. END IF
  1229. ELSE
  1230. //检查价格表和对应币种
  1231. IF uof_chk_pricelistid(arg_moneyid, arg_pricelistid, arg_msg) = 0 THEN
  1232. rslt = 0
  1233. GOTO ext
  1234. END IF
  1235. END IF
  1236. ext:
  1237. RETURN rslt
  1238. end function
  1239. Public Function Integer uof_chk_pricelistid (Long arg_moneyid, Ref Long arg_pricelistid, Ref String arg_msg);
  1240. //检查价格表和币种是否对应
  1241. Int rslt = 1
  1242. Long ll_moneyid_pricelist
  1243. IF arg_pricelistid > 0 THEN
  1244. SELECT moneyid INTO :ll_moneyid_pricelist
  1245. FROM u_sale_price_list
  1246. Where u_sale_price_list.pricelistid = :arg_pricelistid;
  1247. IF sqlca.SQLCode <> 0 THEN
  1248. arg_msg = '查询客户价格表对应币种失败,'+sqlca.SQLErrText
  1249. rslt = 0
  1250. GOTO ext
  1251. END IF
  1252. IF ll_moneyid_pricelist <> arg_moneyid THEN
  1253. arg_msg = '客户价格表对应币种与检查币种不相符,请检查'
  1254. rslt = 0
  1255. GOTO ext
  1256. END IF
  1257. END IF
  1258. ext:
  1259. RETURN rslt
  1260. END Function
  1261. Public Function Integer uof_del_cusprice_auto (Long arg_cusid, Long arg_outwareid, Long arg_printid, Long arg_mtrlid, String arg_status, String arg_woodcode, String arg_pcode, Integer arg_buildtype, Long arg_moneyid, Decimal arg_qty, Decimal arg_qty1, Boolean arg_ifcommit, Ref String arg_msg);
  1262. Int rslt = 1
  1263. Long cnt = 0,ll_cnt = 0
  1264. DateTime ld_opdate
  1265. //检查客户存在否
  1266. SELECT count(*)
  1267. INTO :cnt
  1268. FROM u_cust
  1269. Where u_cust.cusid = :arg_cusid;
  1270. IF sqlca.SQLCode <> 0 THEN
  1271. rslt = 0
  1272. arg_msg = '因网络和其他原因查询失败'+sqlca.SQLErrText
  1273. GOTO ext
  1274. END IF
  1275. IF cnt = 0 THEN
  1276. rslt = 0
  1277. arg_msg = '客户不存在'
  1278. GOTO ext
  1279. END IF
  1280. cnt = 0
  1281. SELECT count(*) INTO :cnt
  1282. FROM cw_currency
  1283. Where moneyid = :arg_moneyid;
  1284. IF sqlca.SQLCode <> 0 THEN
  1285. arg_msg = '查询币种失败'
  1286. rslt = 0
  1287. GOTO ext
  1288. END IF
  1289. IF cnt = 0 THEN
  1290. arg_msg = '币种资料不存在'
  1291. rslt = 0
  1292. GOTO ext
  1293. END IF
  1294. //检查商品存在否
  1295. SELECT count(*)
  1296. INTO :cnt
  1297. FROM u_mtrldef
  1298. Where u_mtrldef.mtrlid = :arg_mtrlid;
  1299. IF sqlca.SQLCode <> 0 THEN
  1300. rslt = 0
  1301. arg_msg = '因网络和其他原因查询失败'+sqlca.SQLErrText
  1302. GOTO ext
  1303. END IF
  1304. IF cnt = 0 THEN
  1305. rslt = 0
  1306. arg_msg = '物料不存在'
  1307. GOTO ext
  1308. END IF
  1309. SELECT count(*) INTO :cnt
  1310. FROM u_cus_price_MX
  1311. WHERE u_cus_price_MX.cusid = :arg_cusid
  1312. AND u_cus_price_MX.mtrlid = :arg_mtrlid
  1313. AND u_cus_price_MX.outwareid = :arg_outwareid
  1314. AND u_cus_price_MX.printid = :arg_printid
  1315. AND u_cus_price_MX.status = :arg_status
  1316. AND u_cus_price_MX.woodcode = :arg_woodcode
  1317. AND u_cus_price_MX.pcode = :arg_pcode
  1318. AND u_cus_price_MX.buildtype = :arg_buildtype
  1319. AND u_cus_price_MX.moneyid = :arg_moneyid
  1320. AND u_cus_price_MX.qty = :arg_qty
  1321. And u_cus_price_mx.qty1 = :arg_qty1;
  1322. IF sqlca.SQLCode <> 0 THEN
  1323. rslt = 0
  1324. arg_msg = '查询失败'+sqlca.SQLErrText
  1325. GOTO ext
  1326. END IF
  1327. IF cnt = 0 THEN
  1328. rslt = 1
  1329. GOTO ext
  1330. END IF
  1331. SELECT top 1 Opdate INTO :ld_opdate
  1332. FROM u_cus_price_MX
  1333. WHERE u_cus_price_MX.cusid = :arg_cusid
  1334. AND u_cus_price_MX.mtrlid = :arg_mtrlid
  1335. AND u_cus_price_MX.outwareid = :arg_outwareid
  1336. AND u_cus_price_MX.printid = :arg_printid
  1337. AND u_cus_price_MX.status = :arg_status
  1338. AND u_cus_price_MX.woodcode = :arg_woodcode
  1339. AND u_cus_price_MX.pcode = :arg_pcode
  1340. AND u_cus_price_mx.buildtype = :arg_buildtype
  1341. AND u_cus_price_mx.moneyid = :arg_moneyid
  1342. AND u_cus_price_MX.qty = :arg_qty
  1343. AND u_cus_price_MX.qty1 = :arg_qty1
  1344. Order By opdate Desc;
  1345. IF sqlca.SQLCode <> 0 THEN
  1346. rslt = 0
  1347. arg_msg = '查询失败'+sqlca.SQLErrText
  1348. GOTO ext
  1349. END IF
  1350. SELECT count(*) INTO :cnt
  1351. FROM u_cus_price_MX
  1352. WHERE u_cus_price_MX.cusid = :arg_cusid
  1353. AND u_cus_price_MX.mtrlid = :arg_mtrlid
  1354. AND u_cus_price_MX.status = :arg_status
  1355. AND u_cus_price_MX.woodcode = :arg_woodcode
  1356. AND u_cus_price_MX.pcode = :arg_pcode
  1357. AND u_cus_price_MX.buildtype = :arg_buildtype
  1358. AND u_cus_price_mx.moneyid = :arg_moneyid
  1359. AND u_cus_price_MX.Opdate > :ld_opdate
  1360. AND u_cus_price_MX.qty = :arg_qty
  1361. And u_cus_price_mx.qty1 = :arg_qty1;
  1362. IF sqlca.SQLCode <> 0 THEN
  1363. rslt = 0
  1364. arg_msg = '查询失败'+sqlca.SQLErrText
  1365. GOTO ext
  1366. END IF
  1367. Decimal ld_fprice,ld_zqrate,ld_price
  1368. DateTime ld_sys_changetime,ld_nulldt
  1369. SetNull(ld_nulldt)
  1370. IF cnt = 0 THEN //如果被删明细是最新,用次新明细更新最新价
  1371. SELECT count(*) INTO :ll_cnt
  1372. FROM u_cus_price_MX
  1373. WHERE u_cus_price_MX.cusid = :arg_cusid
  1374. AND u_cus_price_MX.mtrlid = :arg_mtrlid
  1375. AND u_cus_price_MX.status = :arg_status
  1376. AND u_cus_price_MX.woodcode = :arg_woodcode
  1377. AND u_cus_price_MX.pcode = :arg_pcode
  1378. AND u_cus_price_MX.buildtype = :arg_buildtype
  1379. AND u_cus_price_mx.moneyid = :arg_moneyid
  1380. AND u_cus_price_MX.Opdate < :ld_opdate
  1381. AND u_cus_price_MX.qty = :arg_qty
  1382. And u_cus_price_mx.qty1 = :arg_qty1;
  1383. IF sqlca.SQLCode <> 0 THEN
  1384. rslt = 0
  1385. arg_msg = '查询失败'+sqlca.SQLErrText
  1386. GOTO ext
  1387. END IF
  1388. IF ll_cnt = 0 THEN
  1389. ld_fprice = 0
  1390. ld_zqrate = 1
  1391. ld_price = 0
  1392. ld_sys_changetime = DateTime(Today(),Now())
  1393. ELSE
  1394. SELECT top 1 fprice,zqrate,price,sys_changetime
  1395. INTO :ld_fprice,:ld_zqrate,:ld_price,:ld_sys_changetime
  1396. FROM u_cus_price_MX
  1397. WHERE u_cus_price_MX.cusid = :arg_cusid
  1398. AND u_cus_price_MX.mtrlid = :arg_mtrlid
  1399. AND u_cus_price_MX.status = :arg_status
  1400. AND u_cus_price_MX.woodcode = :arg_woodcode
  1401. AND u_cus_price_MX.pcode = :arg_pcode
  1402. AND u_cus_price_MX.buildtype = :arg_buildtype
  1403. AND u_cus_price_mx.moneyid = :arg_moneyid
  1404. AND u_cus_price_MX.Opdate < :ld_opdate
  1405. AND u_cus_price_MX.qty = :arg_qty
  1406. AND u_cus_price_MX.qty1 = :arg_qty1
  1407. Order By u_cus_price_mx.opdate Desc;
  1408. IF sqlca.SQLCode <> 0 THEN
  1409. rslt = 0
  1410. arg_msg = '查询失败'+sqlca.SQLErrText
  1411. GOTO ext
  1412. END IF
  1413. END IF
  1414. IF arg_buildtype = 0 THEN
  1415. UPDATE u_cus_price
  1416. SET fprice = :ld_fprice ,
  1417. zqrate = :ld_zqrate,
  1418. price = :ld_price,
  1419. sys_changetime = :ld_sys_changetime
  1420. WHERE u_cus_price.cusid = :arg_cusid
  1421. AND u_cus_price.mtrlid = :arg_mtrlid
  1422. AND u_cus_price.status = :arg_status
  1423. AND u_cus_price.woodcode = :arg_woodcode
  1424. AND u_cus_price.pcode = :arg_pcode
  1425. AND u_cus_price.moneyid = :arg_moneyid
  1426. AND u_cus_price.qty = :arg_qty
  1427. And u_cus_price.qty1 = :arg_qty1;
  1428. IF sqlca.SQLCode <> 0 THEN
  1429. rslt = 0
  1430. arg_msg = '更新最新销售价失败'+sqlca.SQLErrText
  1431. GOTO ext
  1432. END IF
  1433. ELSEIF arg_buildtype = 2 THEN
  1434. UPDATE u_cus_price
  1435. SET fprice_bj = :ld_fprice ,
  1436. zqrate_bj = :ld_zqrate,
  1437. price_bj = :ld_price,
  1438. sys_changetime = :ld_sys_changetime
  1439. WHERE u_cus_price.cusid = :arg_cusid
  1440. AND u_cus_price.mtrlid = :arg_mtrlid
  1441. AND u_cus_price.status = :arg_status
  1442. AND u_cus_price.woodcode = :arg_woodcode
  1443. AND u_cus_price.pcode = :arg_pcode
  1444. AND u_cus_price.moneyid = :arg_moneyid
  1445. AND u_cus_price.qty = :arg_qty
  1446. And u_cus_price.qty1 = :arg_qty1;
  1447. IF sqlca.SQLCode <> 0 THEN
  1448. rslt = 0
  1449. arg_msg = '更新最新报价失败'+sqlca.SQLErrText
  1450. GOTO ext
  1451. END IF
  1452. END IF
  1453. END IF
  1454. //删除手动添加价格
  1455. DELETE FROM u_cus_price_MX
  1456. WHERE u_cus_price_MX.cusid = :arg_cusid
  1457. AND u_cus_price_MX.mtrlid = :arg_mtrlid
  1458. AND u_cus_price_MX.outwareid = :arg_outwareid
  1459. AND u_cus_price_MX.printid = :arg_printid
  1460. AND u_cus_price_MX.buildtype = :arg_buildtype
  1461. AND u_cus_price_MX.status = :arg_status
  1462. AND u_cus_price_MX.woodcode = :arg_woodcode
  1463. AND u_cus_price_MX.pcode = :arg_pcode
  1464. AND u_cus_price_MX.moneyid = :arg_moneyid
  1465. AND u_cus_price_MX.qty = :arg_qty
  1466. And u_cus_price_mx.qty1 = :arg_qty1;
  1467. IF sqlca.SQLCode <> 0 THEN
  1468. rslt = 0
  1469. arg_msg = '查询失败'+sqlca.SQLErrText
  1470. GOTO ext
  1471. END IF
  1472. SELECT count(*) INTO :ll_cnt
  1473. FROM u_cus_price_MX
  1474. WHERE u_cus_price_MX.cusid = :arg_cusid
  1475. AND u_cus_price_MX.mtrlid = :arg_mtrlid
  1476. AND u_cus_price_MX.status = :arg_status
  1477. AND u_cus_price_MX.woodcode = :arg_woodcode
  1478. AND u_cus_price_MX.pcode = :arg_pcode
  1479. AND u_cus_price_mx.moneyid = :arg_moneyid
  1480. AND u_cus_price_MX.Opdate < :ld_opdate
  1481. AND u_cus_price_MX.qty = :arg_qty
  1482. And u_cus_price_mx.qty1 = :arg_qty1;
  1483. IF sqlca.SQLCode <> 0 THEN
  1484. rslt = 0
  1485. arg_msg = '查询失败'+sqlca.SQLErrText
  1486. GOTO ext
  1487. END IF
  1488. IF ll_cnt = 0 THEN
  1489. DELETE FROM u_cus_price
  1490. WHERE u_cus_price.cusid = :arg_cusid
  1491. AND u_cus_price.mtrlid = :arg_mtrlid
  1492. AND u_cus_price.status = :arg_status
  1493. AND u_cus_price.woodcode = :arg_woodcode
  1494. AND u_cus_price.pcode = :arg_pcode
  1495. AND u_cus_price.moneyid = :arg_moneyid
  1496. AND u_cus_price.qty = :arg_qty
  1497. And u_cus_price.qty1 = :arg_qty1;
  1498. IF sqlca.SQLCode <> 0 THEN
  1499. rslt = 0
  1500. arg_msg = '查询失败'+sqlca.SQLErrText
  1501. GOTO ext
  1502. END IF
  1503. END IF
  1504. ext:
  1505. IF rslt = 0 THEN
  1506. ROLLBACK;
  1507. ELSEIF rslt = 1 And arg_ifcommit THEN
  1508. COMMIT;
  1509. END IF
  1510. RETURN rslt
  1511. END Function
  1512. public function integer uf_cmpl_price_zhpz (long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_woodcode, string arg_pcode, decimal arg_qty, long arg_pricelistid, long arg_moneyid, decimal arg_rebate_cus, ref decimal rtn_price, ref decimal rtn_zqrate, ref string arg_msg);//计算组合配置产品的价格
  1513. //按status 拆分组合, 按各个组件的价格总和得出组合产品的价格
  1514. //取价格表对应产品价格
  1515. Int rslt = 1
  1516. long ll_i
  1517. dec obj_price
  1518. string ls_status_zj, ls_listname
  1519. dec lde_lmsaleprice, lde_rebate
  1520. int li_flag
  1521. s_mtrlcfg_expr s_pz[]
  1522. String ls_status_ori,ls_woodcode_ori,ls_pcode_ori
  1523. ls_status_ori = arg_status
  1524. ls_woodcode_ori = arg_woodcode
  1525. ls_pcode_ori = arg_pcode
  1526. int li_price_ifpz = 1
  1527. //类似于 price_ifpz = 1
  1528. f_checkpz(arg_status,s_pz[])
  1529. arg_pcode = ''
  1530. arg_woodcode = ''
  1531. //全局用,判断是否在计算组合配置单价
  1532. if_cmpl_zhpz_pf = true
  1533. s_zhpz = s_pz
  1534. obj_price = 0
  1535. FOR ll_i = 1 To UpperBound(s_pz)
  1536. ls_status_zj = s_pz[ll_i].cfgname
  1537. //取价格表 价格, 有公式的按公式计算价格
  1538. IF uof_get_pricelist_price(arg_mtrlid, arg_mtrlcode, ls_status_zj, arg_woodcode, arg_pcode, ls_status_ori, ls_woodcode_ori, ls_pcode_ori, arg_qty * Dec(s_pz[ll_i].qty), arg_pricelistid, arg_moneyid, lde_lmsaleprice, li_flag, ls_listname, lde_rebate, arg_msg) = 0 THEN
  1539. rslt = 0
  1540. GOTO ext
  1541. END IF
  1542. IF uo_option_saleprice_list_rebate = 1 THEN
  1543. lde_rebate = arg_rebate_cus
  1544. END IF
  1545. obj_price = obj_price + lde_lmsaleprice * lde_rebate * Dec(s_pz[ll_i].qty)
  1546. NEXT
  1547. rtn_price = obj_price
  1548. rtn_zqrate = 1
  1549. ext:
  1550. RETURN rslt
  1551. end function
  1552. public function integer uf_cmpl_price (long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_woodcode, string arg_pcode, decimal arg_qty, long arg_pricelistid, long arg_moneyid, decimal arg_rebate_cus, integer arg_price_ifpz, ref decimal rtn_price, ref decimal rtn_zqrate, ref string arg_msg);//计算非组合配置 或 组合配置但没有设置组合的 产品的价格
  1553. //根据单价限制策略, 按设置的配置查找价格
  1554. //取价格表对应产品价格
  1555. Int rslt = 1
  1556. Dec obj_price
  1557. String ls_status_zj, ls_listname
  1558. Dec lde_lmsaleprice, lde_rebate
  1559. Int li_flag
  1560. String ls_status_ori,ls_woodcode_ori,ls_pcode_ori
  1561. ls_status_ori = arg_status
  1562. ls_woodcode_ori = arg_woodcode
  1563. ls_pcode_ori = arg_pcode
  1564. CHOOSE CASE arg_price_ifpz
  1565. CASE 0
  1566. arg_status = ''
  1567. arg_woodcode = ''
  1568. arg_pcode = ''
  1569. CASE 1
  1570. arg_pcode = ''
  1571. arg_woodcode = ''
  1572. CASE 2
  1573. arg_status = ''
  1574. arg_pcode = ''
  1575. CASE 3
  1576. arg_status = ''
  1577. arg_woodcode = ''
  1578. CASE 4
  1579. arg_pcode = ''
  1580. CASE 5
  1581. arg_status = ''
  1582. CASE 6
  1583. arg_woodcode = ''
  1584. END CHOOSE
  1585. //取价格表 公式内容
  1586. IF uof_get_pricelist_price(arg_mtrlid, arg_mtrlcode, arg_status, arg_woodcode, arg_pcode, ls_status_ori, ls_woodcode_ori, ls_pcode_ori, arg_qty, arg_pricelistid, arg_moneyid, lde_lmsaleprice, li_flag, ls_listname, lde_rebate, arg_msg) = 0 THEN
  1587. rslt = 0
  1588. GOTO ext
  1589. END IF
  1590. IF uo_option_saleprice_list_rebate = 1 THEN
  1591. lde_rebate = arg_rebate_cus
  1592. END IF
  1593. rtn_price = lde_lmsaleprice
  1594. rtn_zqrate = lde_rebate
  1595. ext:
  1596. RETURN rslt
  1597. end function
  1598. public function integer uof_get_pricelistinfo (long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_woodcode, string arg_pcode, string arg_status_ori, string arg_woodcode_ori, string arg_pcode_ori, decimal arg_qty, long arg_pricelistid, ref decimal arg_lmsaleprice, ref integer arg_flag, ref string arg_listname, ref decimal arg_rebate, ref string arg_msg);
  1599. //取价格表对应产品价格
  1600. //产品价格表公式与产品价格策略的限制
  1601. Int rslt = 1
  1602. Long ll_moneyid_pricelist
  1603. String ls_pricestr,ls_rebatestr
  1604. Int li_rslt_cmp
  1605. Decimal ld_price_cmp,ld_rebate_cmp
  1606. Int li_price_ifpz
  1607. String ls_status_ori,ls_woodcode_ori,ls_pcode_ori
  1608. ls_status_ori = arg_status
  1609. ls_woodcode_ori = arg_woodcode
  1610. ls_pcode_ori = arg_pcode
  1611. li_price_ifpz = 0
  1612. SELECT u_sale_price_list.listname
  1613. INTO :arg_listname
  1614. FROM u_sale_price_list
  1615. Where pricelistid = :arg_pricelistid;
  1616. IF sqlca.SQLCode <> 0 THEN
  1617. rslt = 0
  1618. arg_msg = "查询价格表信息失败,"+sqlca.SQLErrText
  1619. GOTO ext
  1620. END IF
  1621. SELECT u_sale_price_mx.price,
  1622. u_sale_price_mx.flag,
  1623. u_sale_price_mx.rebate,
  1624. u_sale_price_mx.pricestr,
  1625. u_sale_price_mx.rebatestr
  1626. INTO :arg_lmsaleprice,
  1627. :arg_flag,
  1628. :arg_rebate,
  1629. :ls_pricestr,
  1630. :ls_rebatestr
  1631. FROM u_sale_price_list,u_sale_price_mx
  1632. WHERE u_sale_price_mx.pricelistid = u_sale_price_list.pricelistid
  1633. AND u_sale_price_mx.mtrlid = :arg_mtrlid
  1634. AND u_sale_price_mx.status = :arg_status
  1635. AND u_sale_price_mx.woodcode = :arg_woodcode
  1636. AND u_sale_price_mx.pcode = :arg_pcode
  1637. AND ( (u_sale_price_mx.saleqty = 0 OR u_sale_price_mx.saleqty <= :arg_qty)
  1638. AND (u_sale_price_mx.saleqty1 = 0 OR u_sale_price_mx.saleqty1 >= :arg_qty))
  1639. And u_sale_price_mx.pricelistid = :arg_pricelistid;
  1640. IF sqlca.SQLCode <> 0 THEN
  1641. rslt = 0
  1642. //arg_msg = '查询产品:'+arg_mtrlcode+',配置:'+arg_status+',配置1:'+arg_woodcode+',配置2:'+arg_pcode+',销售限价失败,可能该客户的销售限价还没有设定,请检查'
  1643. if if_chk_mxlist then
  1644. arg_msg = '客户价格表未找到'
  1645. else
  1646. arg_msg = '价格表['+arg_listname+']未找到'
  1647. end if
  1648. arg_msg += '产品:'+arg_mtrlcode
  1649. IF arg_status <> "" THEN
  1650. arg_msg += ',配置:'+arg_status
  1651. END IF
  1652. IF arg_woodcode <> "" THEN
  1653. arg_msg += ',配置1:'+arg_woodcode
  1654. END IF
  1655. IF arg_pcode <> "" THEN
  1656. arg_msg += ',配置2:'+arg_pcode
  1657. END IF
  1658. arg_msg += '的相关信息'
  1659. GOTO ext
  1660. END IF
  1661. IF arg_flag = 0 THEN
  1662. rslt = 0
  1663. if if_chk_mxlist then
  1664. arg_msg = '客户价格表对应'
  1665. else
  1666. arg_msg = '价格表['+arg_listname+']对应'
  1667. end if
  1668. arg_msg += '产品:'+arg_mtrlcode
  1669. IF arg_status <> "" THEN
  1670. arg_msg += ',配置:'+arg_status
  1671. END IF
  1672. IF arg_woodcode <> "" THEN
  1673. arg_msg += ',配置1:'+arg_woodcode
  1674. END IF
  1675. IF arg_pcode <> "" THEN
  1676. arg_msg += ',配置2:'+arg_pcode
  1677. END IF
  1678. arg_msg += '未审核'
  1679. GOTO ext
  1680. END IF
  1681. IF Trim(ls_pricestr) <> '' THEN
  1682. //li_rslt_cmp = uof_pricestr_cmp(ls_pricestr,arg_status,arg_woodcode,arg_pcode,ld_price_cmp)
  1683. li_rslt_cmp = uof_pricestr_cmp(ls_pricestr, arg_status_ori, arg_woodcode_ori, arg_pcode_ori,ld_price_cmp)
  1684. IF li_rslt_cmp = 1 THEN
  1685. arg_lmsaleprice = ld_price_cmp
  1686. ELSEIF li_rslt_cmp = 0 THEN
  1687. arg_lmsaleprice = 0
  1688. END IF
  1689. END IF
  1690. IF Trim(ls_rebatestr) <> '' THEN
  1691. // li_rslt_cmp = uof_pricestr_cmp(ls_pricestr,arg_status,arg_woodcode,arg_pcode,ld_rebate_cmp)
  1692. li_rslt_cmp = uof_pricestr_cmp(ls_pricestr,arg_status_ori, arg_woodcode_ori, arg_pcode_ori , ld_rebate_cmp)
  1693. IF li_rslt_cmp = 1 THEN
  1694. arg_rebate = ld_rebate_cmp
  1695. ELSEIF li_rslt_cmp = 0 THEN
  1696. arg_rebate = 1
  1697. END IF
  1698. END IF
  1699. ext:
  1700. RETURN rslt
  1701. end function
  1702. public function integer uof_get_pricelist_price (long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_woodcode, string arg_pcode, string arg_status_ori, string arg_woodcode_ori, string arg_pcode_ori, decimal arg_qty, long arg_pricelistid, long arg_moneyid, ref decimal arg_lmsaleprice, ref integer arg_flag, ref string arg_listname, ref decimal arg_rebate, ref string arg_msg);//要求传人的3个配置是 原配置
  1703. //取价格表对应产品价格
  1704. Int rslt = 1
  1705. //取价格表
  1706. IF arg_pricelistid > 0 THEN
  1707. IF uof_chk_pricelistid( arg_moneyid, arg_pricelistid, arg_msg) = 0 THEN
  1708. rslt = 0
  1709. GOTO ext
  1710. END IF
  1711. ELSE
  1712. IF uof_get_pricelistid(arg_mtrlid, arg_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, arg_moneyid, arg_pricelistid, arg_msg) = 0 THEN
  1713. rslt = 0
  1714. GOTO ext
  1715. END IF
  1716. END IF
  1717. //取价格表 公式内容
  1718. IF uof_get_pricelistinfo(arg_mtrlid, arg_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_status_ori, arg_woodcode_ori, arg_pcode_ori, arg_qty, arg_pricelistid, arg_lmsaleprice, arg_flag, arg_listname, arg_rebate, arg_msg) = 0 THEN
  1719. rslt = 0
  1720. GOTO ext
  1721. END IF
  1722. ext:
  1723. RETURN rslt
  1724. end function
  1725. public function integer uf_cmpl_price_pack (long arg_mtrlid, string arg_mtrlcode, string arg_status, string arg_woodcode, string arg_pcode, decimal arg_qty, long arg_pricelistid, long arg_moneyid, decimal arg_rebate_cus, integer arg_price_ifpz, ref decimal rtn_price, ref decimal rtn_zqrate, ref string arg_msg);//计算包件产品的价格
  1726. Int rslt = 1
  1727. String ls_pf_status[],ls_pf_woodcode[],ls_pf_pcode[]
  1728. Int li_ifover[],li_dipztype[]
  1729. Decimal ld_Sonscale[]
  1730. Long ll_SonMtrlid[]
  1731. string ls_mtrlcode[]
  1732. Long it_mxt = 1,ll_j
  1733. String ls_status_find,ls_woodcode_find,ls_pcode_find
  1734. String ls_status_zj, ls_listname
  1735. Decimal lde_lmsaleprice, lde_rebate,obj_price
  1736. Int li_flag
  1737. String ls_status_ori,ls_woodcode_ori,ls_pcode_ori
  1738. ls_status_ori = arg_status
  1739. ls_woodcode_ori = arg_woodcode
  1740. ls_pcode_ori = arg_pcode
  1741. Declare cur_pf Cursor For
  1742. Select u_PrdPF.SonMtrlid,
  1743. u_PrdPF.status,
  1744. u_PrdPF.woodcode,
  1745. u_PrdPF.pcode,
  1746. u_PrdPF.ifover,
  1747. u_prdpf.dipztype,
  1748. u_prdpf.Sonscale,
  1749. u_mtrldef.mtrlcode
  1750. FROM u_PrdPF INNER JOIN
  1751. u_mtrl_pf ON u_PrdPF.mtrlid = u_mtrl_pf.Mtrlid AND
  1752. u_PrdPF.pfcode = u_mtrl_pf.pfcode INNER JOIN
  1753. u_mtrldef ON u_PrdPF.SonMtrlid = u_mtrldef.mtrlid
  1754. where ( u_PrdPF.mtrlid = :arg_mtrlid )
  1755. And ( u_mtrl_pf.ifdft = 1 );
  1756. Open cur_pf;
  1757. Fetch cur_pf Into :ll_SonMtrlid[it_mxt],:ls_pf_status[it_mxt],
  1758. :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],
  1759. :li_dipztype[it_mxt],:ld_Sonscale[it_mxt],:ls_mtrlcode[it_mxt];
  1760. Do While sqlca.SQLCode = 0
  1761. it_mxt++
  1762. Fetch cur_pf Into :ll_SonMtrlid[it_mxt],:ls_pf_status[it_mxt],
  1763. :ls_pf_woodcode[it_mxt],:ls_pf_pcode[it_mxt],:li_ifover[it_mxt],
  1764. :li_dipztype[it_mxt],:ld_Sonscale[it_mxt],:ls_mtrlcode[it_mxt];
  1765. Loop
  1766. it_mxt = it_mxt - 1
  1767. Close cur_pf;
  1768. For ll_j = 1 To it_mxt
  1769. If li_ifover[ll_j] = 1 Then
  1770. Choose Case li_dipztype[ll_j]
  1771. Case 0
  1772. ls_status_find = arg_status
  1773. ls_woodcode_find = ''
  1774. ls_pcode_find = ''
  1775. Case 1
  1776. ls_status_find = ''
  1777. ls_woodcode_find = arg_woodcode
  1778. ls_pcode_find = ''
  1779. Case 2
  1780. ls_status_find = ''
  1781. ls_woodcode_find = ''
  1782. ls_pcode_find = arg_pcode
  1783. Case 3
  1784. ls_status_find = arg_status
  1785. ls_woodcode_find = arg_woodcode
  1786. ls_pcode_find = ''
  1787. Case 4
  1788. ls_status_find = ''
  1789. ls_woodcode_find = arg_woodcode
  1790. ls_pcode_find = arg_pcode
  1791. Case 5
  1792. ls_status_find = arg_status
  1793. ls_woodcode_find = ''
  1794. ls_pcode_find = arg_pcode
  1795. Case 6
  1796. ls_status_find = arg_status
  1797. ls_woodcode_find = arg_woodcode
  1798. ls_pcode_find = arg_pcode
  1799. End Choose
  1800. Else
  1801. ls_status_find = ls_pf_status[ll_j]
  1802. ls_woodcode_find = ls_pf_woodcode[ll_j]
  1803. ls_pcode_find = ls_pf_pcode[ll_j]
  1804. End If
  1805. ls_status_find = Trim(ls_status_find)
  1806. ls_woodcode_find = Trim(ls_woodcode_find)
  1807. ls_pcode_find = Trim(ls_pcode_find)
  1808. If uof_get_pricelist_price(ll_SonMtrlid[ll_j] ,ls_mtrlcode[ll_j], ls_status_find, ls_woodcode_find, ls_pcode_find, ls_status_ori, ls_woodcode_ori, ls_pcode_ori, arg_qty * Dec(ld_Sonscale[ll_j]), arg_pricelistid, arg_moneyid, lde_lmsaleprice, li_flag, ls_listname, lde_rebate, arg_msg) = 0 Then
  1809. rslt = 0
  1810. Goto ext
  1811. End If
  1812. IF uo_option_saleprice_list_rebate = 1 THEN
  1813. lde_rebate = arg_rebate_cus
  1814. END IF
  1815. obj_price = obj_price + lde_lmsaleprice * lde_rebate * ld_Sonscale[ll_j]
  1816. Next
  1817. rtn_price = obj_price
  1818. rtn_zqrate = 1
  1819. ext:
  1820. Return rslt
  1821. end function
  1822. public function integer uof_get_mtrl_bjpz (ref datastore ds, long arg_pztype, long arg_type, string arg_col_value_dft, string arg_col_value, integer arg_mtrlpztype, ref string arg_msg);//arg_pztype 属于哪个配置 0 - 配置status; 1- 配置1 woodcode; 2-配置2 pcode
  1823. //arg_type 配置类型,哪个部件配置类型
  1824. Int rslt = 1
  1825. Long ll_row
  1826. String ls_pzcode, ls_pzname
  1827. Int li_inputtype
  1828. Long ll_pzid
  1829. Int li_usechflag, li_secflag
  1830. String ls_contfigtypename
  1831. Decimal lde_price
  1832. //检查分类是否启用换料,是否财审
  1833. SELECT usechflag, secflag, contfigtypename
  1834. INTO :li_usechflag, :li_secflag, :ls_contfigtypename
  1835. FROM u_configure_type
  1836. Where contfigtypeid = :arg_type;
  1837. IF sqlca.SQLCode <> 0 THEN
  1838. rslt = 0
  1839. arg_msg = "查询部件选配分类信息失败,"+sqlca.SQLErrText
  1840. GOTO ext
  1841. END IF
  1842. IF li_usechflag = 0 THEN RETURN 1
  1843. IF li_secflag = 0 THEN //要换但未审
  1844. rslt = 0
  1845. arg_msg = "部件选配分类:"+ls_contfigtypename+" 还未财审"
  1846. GOTO ext
  1847. END IF
  1848. DECLARE cur_pz CURSOR FOR
  1849. SELECT u_configure_code.pzid,
  1850. u_configure_code.pzcode,
  1851. u_configure_code.name,
  1852. inputtype
  1853. FROM u_configure_code
  1854. Where u_configure_code.typeid = :arg_type;
  1855. OPEN cur_pz;
  1856. FETCH cur_pz Into :ll_pzid,:ls_pzcode,:ls_pzname, :li_inputtype;
  1857. DO WHILE sqlca.SQLCode = 0
  1858. IF li_inputtype = 0 And ll_pzid > 0 THEN //只有选择类才能自动换
  1859. ll_row = ds.InsertRow(0)
  1860. ds.Object.pzid[ll_row] = ll_pzid
  1861. ds.Object.pzcode[ll_row] = ls_pzcode
  1862. ds.Object.Name[ll_row] = ls_pzname
  1863. ds.Object.inputtype[ll_row] = li_inputtype
  1864. ds.Object.pztype[ll_row] = arg_pztype
  1865. END IF
  1866. FETCH cur_pz Into :ll_pzid,:ls_pzcode,:ls_pzname, :li_inputtype;
  1867. LOOP
  1868. CLOSE cur_pz;
  1869. Long i, ll_start, ll_i, ll_j
  1870. String ls_name[], ls_namemx[]
  1871. Long ll_printid
  1872. //arg_col_value
  1873. IF Right(arg_col_value,1) <> "|" THEN
  1874. arg_col_value += "|"
  1875. END IF
  1876. i = 0
  1877. ll_start = Pos(arg_col_value, "|")
  1878. DO WHILE ll_start > 0 And arg_col_value <> "|"
  1879. i++
  1880. ls_name[i] = Left(arg_col_value, Pos(arg_col_value,":") - 1)
  1881. ls_namemx[i] = Left(arg_col_value, ll_start - 1)
  1882. ls_namemx[i] = Mid(ls_namemx[i],Pos(ls_namemx[i],':') + 1)
  1883. arg_col_value = Mid(arg_col_value, ll_start + 1)
  1884. ll_start = Pos(arg_col_value, "|")
  1885. LOOP
  1886. FOR ll_i = 1 To ds.RowCount()
  1887. ll_pzid = ds.Object.pzid[ll_i]
  1888. IF UpperBound(ls_namemx) < i THEN EXIT
  1889. FOR ll_j = 1 To i
  1890. IF ds.Object.Name[ll_i] = ls_name[ll_j] THEN
  1891. ll_pzid = ds.Object.pzid[ll_i]
  1892. SELECT printid, price
  1893. INTO :ll_printid, :lde_price
  1894. FROM u_configure_codemx
  1895. WHERE namemx = :ls_namemx[ll_j]
  1896. And pzid = :ll_pzid;
  1897. IF sqlca.SQLCode <> 0 THEN
  1898. ll_printid = 0
  1899. lde_price = 0
  1900. END IF
  1901. ds.Object.namemx[ll_i] = ls_namemx[ll_j]
  1902. ds.Object.printid[ll_i] = ll_printid
  1903. ds.Object.price[ll_i] = lde_price
  1904. GOTO _next
  1905. END IF
  1906. NEXT
  1907. _next:
  1908. NEXT
  1909. //arg_col_value_dft
  1910. IF Right(arg_col_value_dft,1) <> "|" THEN
  1911. arg_col_value_dft += "|"
  1912. END IF
  1913. i = 0
  1914. ll_start = Pos(arg_col_value_dft, "|")
  1915. DO WHILE ll_start > 0 And arg_col_value_dft <> "|"
  1916. i++
  1917. ls_name[i] = Left(arg_col_value_dft, Pos(arg_col_value_dft,":") - 1)
  1918. ls_namemx[i] = Left(arg_col_value_dft, ll_start - 1)
  1919. ls_namemx[i] = Mid(ls_namemx[i],Pos(ls_namemx[i],':') + 1)
  1920. arg_col_value_dft = Mid(arg_col_value_dft, ll_start + 1)
  1921. ll_start = Pos(arg_col_value_dft, "|")
  1922. LOOP
  1923. FOR ll_i = 1 To ds.RowCount()
  1924. ll_pzid = ds.Object.pzid[ll_i]
  1925. IF UpperBound(ls_namemx) < i THEN EXIT
  1926. FOR ll_j = 1 To i
  1927. IF ds.Object.Name[ll_i] = ls_name[ll_j] THEN
  1928. ll_pzid = ds.Object.pzid[ll_i]
  1929. SELECT printid, price
  1930. INTO :ll_printid, :lde_price
  1931. FROM u_configure_codemx
  1932. WHERE namemx = :ls_namemx[ll_j]
  1933. And pzid = :ll_pzid;
  1934. IF sqlca.SQLCode <> 0 THEN
  1935. ll_printid = 0
  1936. lde_price = 0
  1937. END IF
  1938. ds.Object.namemx_ori[ll_i] = ls_namemx[ll_j]
  1939. ds.Object.printid_ori[ll_i] = ll_printid
  1940. ds.Object.price_ori[ll_i] = lde_price
  1941. GOTO _next1
  1942. END IF
  1943. NEXT
  1944. _next1:
  1945. NEXT
  1946. //筛选一遍, 将相同的删除; 确定自动换料类型kind; 0 - 换料; 1 - 减料; 2 - 增料
  1947. String ls_namemx_ori, ls_namemx_new
  1948. ll_row = ds.RowCount()
  1949. FOR ll_i = ll_row To 1 Step -1
  1950. IF ds.Object.pzid[ll_i] = 0 THEN
  1951. ds.DeleteRow(ll_i)
  1952. CONTINUE
  1953. END IF
  1954. IF ds.Object.pztype[ll_i] = arg_pztype THEN
  1955. ls_namemx_ori = ds.Object.namemx_ori[ll_i]
  1956. ls_namemx_new = ds.Object.namemx[ll_i]
  1957. IF arg_mtrlpztype = 4 THEN
  1958. IF ds.Object.namemx_ori[ll_i] = ds.Object.namemx[ll_i] THEN
  1959. ds.DeleteRow(ll_i)
  1960. CONTINUE
  1961. END IF
  1962. ELSEIF arg_mtrlpztype = 5 THEN
  1963. IF ds.Object.namemx_ori[ll_i] = ds.Object.namemx[ll_i] Or ds.Object.namemx[ll_i] = '' THEN
  1964. ds.DeleteRow(ll_i)
  1965. CONTINUE
  1966. END IF
  1967. END IF
  1968. //以下的就是namemx_ori <> namemxi
  1969. IF ds.Object.namemx_ori[ll_i] = "" And ds.Object.namemx[ll_i] <> "" THEN //增料
  1970. ds.Object.Kind[ll_i] = 2
  1971. ELSEIF ds.Object.namemx_ori[ll_i] <> "" And ds.Object.namemx[ll_i] <> "" THEN //替换
  1972. ds.Object.Kind[ll_i] = 0
  1973. ELSEIF ds.Object.namemx_ori[ll_i] <> "" And ds.Object.namemx[ll_i] = "" THEN //减料
  1974. ds.Object.Kind[ll_i] = 1
  1975. END IF
  1976. END IF
  1977. NEXT
  1978. //如果系组合配置的, 重新刷一次差价
  1979. IF if_cmpl_zhpz_pf THEN
  1980. Decimal lde_addprice, lde_price_ori
  1981. Long ll_printid_ori
  1982. String ls_mxpzname
  1983. //ll_row = ds.RowCount()
  1984. FOR ll_i = 1 To ds.RowCount()
  1985. IF ds.Object.pztype[ll_i] = arg_pztype THEN
  1986. ll_pzid = ds.Object.pzid[ll_i]
  1987. ll_printid = ds.Object.printid[ll_i]
  1988. ll_printid_ori = ds.Object.printid_ori[ll_i]
  1989. lde_price = 0
  1990. lde_price_ori = 0
  1991. FOR ll_j = 1 To UpperBound(s_zhpz)
  1992. ls_mxpzname = s_zhpz[ll_j].cfgname
  1993. SELECT price
  1994. INTO :lde_addprice
  1995. FROM u_configure_codemx_pz
  1996. WHERE pzid = :ll_pzid
  1997. AND printid = :ll_printid
  1998. And Name = :ls_mxpzname;
  1999. IF sqlca.SQLCode <> 0 THEN
  2000. lde_addprice = 0
  2001. END IF
  2002. IF IsNull(lde_addprice) THEN lde_addprice = 0
  2003. lde_price += lde_addprice * Dec(s_zhpz[ll_j].qty)
  2004. SELECT price
  2005. INTO :lde_addprice
  2006. FROM u_configure_codemx_pz
  2007. WHERE pzid = :ll_pzid
  2008. AND printid = :ll_printid_ori
  2009. And Name = :ls_mxpzname;
  2010. IF sqlca.SQLCode <> 0 THEN
  2011. lde_addprice = 0
  2012. END IF
  2013. IF IsNull(lde_addprice) THEN lde_addprice = 0
  2014. lde_price_ori += lde_addprice * Dec(s_zhpz[ll_j].qty)
  2015. NEXT
  2016. ds.Object.price[ll_i] = lde_price
  2017. ds.Object.price_ori[ll_i] = lde_price_ori
  2018. END IF
  2019. NEXT
  2020. END IF
  2021. ext:
  2022. RETURN rslt
  2023. end function
  2024. public function integer uof_get_mtrl_ygpz (ref datastore ds, long arg_pztype, long arg_type, string arg_col_value_dft, string arg_col_value, ref string arg_msg);IF arg_col_value = arg_col_value_dft THEN RETURN 1 //不需要换的跳过
  2025. Int rslt = 1
  2026. Long ll_row
  2027. String ls_pzcode, ls_pzname
  2028. Int li_inputtype
  2029. Int li_usechflag, li_flag
  2030. String ls_typename
  2031. decimal lde_price, lde_price_ori
  2032. ls_pzcode = "[严格选择]"
  2033. //检查分类是否启用换料,是否技审
  2034. SELECT usechflag, flag, typename
  2035. INTO :li_usechflag, :li_flag, :ls_typename
  2036. FROM u_pztype_def
  2037. Where typeid = :arg_type;
  2038. IF sqlca.SQLCode <> 0 THEN
  2039. rslt = 0
  2040. arg_msg = "查询严格选择配置分类信息失败,"+sqlca.SQLErrText
  2041. GOTO ext
  2042. END IF
  2043. IF li_usechflag = 0 THEN RETURN 1
  2044. IF li_flag = 0 THEN //要换但未审
  2045. rslt = 0
  2046. arg_msg = "严格选择配置分类:"+ls_typename+" 还未审核"
  2047. GOTO ext
  2048. END IF
  2049. SELECT price into :lde_price
  2050. FROM u_pztype_mx
  2051. where (typeid = :arg_type)
  2052. and (dscrp = :arg_col_value);
  2053. IF sqlca.SQLCode <> 0 THEN
  2054. rslt = 0
  2055. arg_msg = "查询严格选择配置分类信息新差价失败,"+sqlca.SQLErrText
  2056. GOTO ext
  2057. END IF
  2058. SELECT price into :lde_price_ori
  2059. FROM u_pztype_mx
  2060. where (typeid = :arg_type)
  2061. and (dscrp = :arg_col_value_dft);
  2062. IF sqlca.SQLCode <> 0 THEN
  2063. rslt = 0
  2064. arg_msg = "查询严格选择配置分类信息原差价失败,"+sqlca.SQLErrText
  2065. GOTO ext
  2066. END IF
  2067. ll_row = ds.InsertRow(0)
  2068. ds.Object.pzid[ll_row] = arg_type
  2069. ds.Object.pzcode[ll_row] = ls_pzcode
  2070. ds.Object.Name[ll_row] = ls_typename
  2071. ds.Object.namemx[ll_row] = arg_col_value
  2072. ds.Object.namemx_ori[ll_row] = arg_col_value_dft
  2073. ds.Object.inputtype[ll_row] = li_inputtype
  2074. ds.Object.pztype[ll_row] = arg_pztype
  2075. ds.Object.price[ll_row] = lde_price
  2076. ds.Object.price_ori[ll_row] = lde_price_ori
  2077. //以下的就是namemx_ori <> namemxi
  2078. IF ds.Object.namemx_ori[ll_row] = "" And ds.Object.namemx[ll_row] <> "" THEN //增料
  2079. ds.Object.Kind[ll_row] = 2
  2080. ELSEIF ds.Object.namemx_ori[ll_row] <> "" And ds.Object.namemx[ll_row] <> "" THEN //替换
  2081. ds.Object.Kind[ll_row] = 0
  2082. ELSEIF ds.Object.namemx_ori[ll_row] <> "" And ds.Object.namemx[ll_row] = "" THEN //减料
  2083. ds.Object.Kind[ll_row] = 1
  2084. END IF
  2085. ext:
  2086. RETURN rslt
  2087. end function
  2088. public function integer uof_get_mtrl_3pz_difprice (long arg_mtrlid, string arg_status, string arg_woodcode, string arg_pcode, ref decimal arg_difprice, ref string arg_msg);//1.只查询支持换料的行, 计算换料差价, sum(原配置价 - 新配置价)
  2089. //datastore ds_pzmx
  2090. ds_pzmx = Create datastore
  2091. ds_pzmx.DataObject = 'dw_configure_pz_compare'
  2092. Int rslt = 1
  2093. Long ll_row
  2094. Int li_statusflag,li_woodcodeflag,li_pcodeflag
  2095. Long ll_statustype, ll_woodcodetype, ll_pcodetype
  2096. String ls_status_config, ls_woodcode_config, ls_pcode_config
  2097. SELECT statusflag, statustype, woodcodeflag, woodcodetype, pcodeflag, pcodetype,
  2098. status_config, woodcode_config, pcode_config
  2099. INTO :li_statusflag,:ll_statustype,:li_woodcodeflag,:ll_woodcodetype,:li_pcodeflag,:ll_pcodetype,
  2100. :ls_status_config, :ls_woodcode_config, :ls_pcode_config
  2101. FROM u_mtrldef
  2102. Where mtrlid = :arg_mtrlid;
  2103. IF sqlca.SQLCode <> 0 THEN
  2104. rslt = 0
  2105. arg_msg = '查询物料资料失败,'+sqlca.SQLErrText
  2106. GOTO ext
  2107. END IF
  2108. //status
  2109. IF li_statusflag = 1 THEN
  2110. IF uof_get_mtrl_ygpz(ds_pzmx, 0, ll_statustype, ls_status_config, arg_status, arg_msg) = 0 THEN
  2111. rslt = 0
  2112. arg_msg = "生成严格选择配置换料列表失败,"+arg_msg
  2113. GOTO ext
  2114. END IF
  2115. END IF
  2116. IF li_statusflag = 4 Or li_statusflag = 5 THEN
  2117. IF uof_get_mtrl_bjpz(ds_pzmx, 0, ll_statustype, ls_status_config, arg_status, li_statusflag, arg_msg) = 0 THEN
  2118. rslt = 0
  2119. arg_msg = "生成部件选配配置换料列表失败,"+arg_msg
  2120. GOTO ext
  2121. END IF
  2122. END IF
  2123. //woodcode
  2124. IF li_woodcodeflag = 1 THEN
  2125. IF uof_get_mtrl_ygpz(ds_pzmx, 1, ll_woodcodetype, ls_woodcode_config, arg_woodcode, arg_msg) = 0 THEN
  2126. rslt = 0
  2127. arg_msg = "生成严格选择配置1换料列表失败,"+arg_msg
  2128. GOTO ext
  2129. END IF
  2130. END IF
  2131. IF li_woodcodeflag = 4 Or li_woodcodeflag = 5 THEN
  2132. IF uof_get_mtrl_bjpz(ds_pzmx, 1, ll_woodcodetype, ls_woodcode_config, arg_woodcode, li_woodcodeflag, arg_msg) = 0 THEN
  2133. rslt = 0
  2134. arg_msg = "生成部件选配配置1换料列表失败,"+arg_msg
  2135. GOTO ext
  2136. END IF
  2137. END IF
  2138. //pcode
  2139. IF li_pcodeflag = 1 THEN
  2140. IF uof_get_mtrl_ygpz(ds_pzmx, 2, ll_pcodetype, ls_pcode_config, arg_pcode, arg_msg) = 0 THEN
  2141. rslt = 0
  2142. arg_msg = "生成严格选择配置2换料列表失败,"+arg_msg
  2143. GOTO ext
  2144. END IF
  2145. END IF
  2146. IF li_pcodeflag = 4 Or li_pcodeflag = 5 THEN
  2147. IF uof_get_mtrl_bjpz(ds_pzmx, 2, ll_pcodetype, ls_pcode_config, arg_pcode, li_pcodeflag, arg_msg) = 0 THEN
  2148. rslt = 0
  2149. arg_msg = "生成部件选配配置2换料列表失败,"+arg_msg
  2150. GOTO ext
  2151. END IF
  2152. END IF
  2153. arg_difprice = 0
  2154. FOR ll_row = 1 To ds_pzmx.RowCount()
  2155. arg_difprice += ds_pzmx.Object.price[ll_row] - ds_pzmx.Object.price_ori[ll_row]
  2156. NEXT
  2157. ext:
  2158. destroy ds_pzmx
  2159. IF rslt = 0 THEN
  2160. arg_difprice = 0
  2161. END IF
  2162. RETURN rslt
  2163. end function
  2164. public function integer uof_getprice_quote (long arg_moneyid, long arg_pricelistid, long arg_cusid, long arg_mtrlid, string arg_status, string arg_woodcode, string arg_pcode, decimal arg_qty, long arg_scid, ref decimal arg_price, ref decimal arg_rebate, ref string arg_msg);
  2165. //产品价格表公式与产品价格策略的限制
  2166. //1.产品价格策略已设置限制的配置不能应用于价格表公式;
  2167. //例如:产品价格策略 选择为 不使用 ; 则价格表公式可以用 配置 配置1, 配置2 设置公式;
  2168. // 产品价格策略 选择为 配置 ; 则价格表公式不能是用 配置 , 但可以用 配置1, 配置2 设置公式;
  2169. // 产品价格策略 选择为 配置 + 配置1; 则价格表公式不能是用 配置 或 配置1 , 但可以用 配置2 设置公式;
  2170. // 产品价格策略 选择为 配置 + 配置1 + 配置3; 则价格表公式不能使用;
  2171. Int rslt = 1
  2172. Long ll_statusflag,li_price_ifpz
  2173. String ls_mtrlcode
  2174. String ls_cusname
  2175. Long ll_pricelistid,ll_pricelistid_arr[],ll_mxbt = 0,ll_pricelistid_tmp
  2176. Decimal ld_lmsaleprice,ld_rebate,obj_price,ld_rebate_arr[],ld_rebate_tmp
  2177. Long ll_i
  2178. String ls_status_zj
  2179. //Int li_flag
  2180. String ls_listname
  2181. Decimal ld_rebate_cus
  2182. Decimal rtn_price,rtn_zqrate
  2183. //Int li_selecttype
  2184. Int li_suc = 0
  2185. Int li_ifpackpro,li_ifpricepack
  2186. Long ll_moneyid_native
  2187. Decimal lde_difprice
  2188. s_mtrlcfg_expr s_pz[]
  2189. IF uo_option_saleprice_list_rebate = -1000 THEN
  2190. rslt = 0
  2191. arg_msg = '选项:[237]客户价格表折扣按客户设定,读取初始默认值失败,操作取消!'
  2192. GOTO ext
  2193. END IF
  2194. IF uo_option_price_rmb = -1000 THEN
  2195. rslt = 0
  2196. arg_msg = '选项:[238]销售单价按人民币单价折算,读取初始默认值失败,操作取消!'
  2197. GOTO ext
  2198. END IF
  2199. String ls_status_ori,ls_woodcode_ori,ls_pcode_ori
  2200. ls_status_ori = arg_status
  2201. ls_woodcode_ori = arg_woodcode
  2202. ls_pcode_ori = arg_pcode
  2203. //yyx2012-12-11
  2204. IF uo_option_price_rmb = 1 THEN
  2205. SELECT moneyid INTO :ll_moneyid_native
  2206. From cw_currency Where native = 1;
  2207. IF sqlca.SQLCode <> 0 THEN
  2208. arg_msg = '查询本位币种失败,请检查币种是否设置了本位币'
  2209. rslt = 0
  2210. GOTO ext
  2211. END IF
  2212. arg_moneyid = ll_moneyid_native
  2213. END IF
  2214. //IF f_get_selecttype(arg_typeid,arg_cusid,li_selecttype,arg_msg) = 0 THEN
  2215. // rslt = 0
  2216. // GOTO ext
  2217. //END IF
  2218. SELECT statusflag,mtrlcode,price_ifpz,ifpackpro,ifpricepack
  2219. INTO :ll_statusflag,:ls_mtrlcode,:li_price_ifpz,:li_ifpackpro,:li_ifpricepack
  2220. FROM u_mtrldef
  2221. Where mtrlid = :arg_mtrlid;
  2222. IF sqlca.SQLCode <> 0 THEN
  2223. rslt = 0
  2224. GOTO ext
  2225. END IF
  2226. SELECT name,pricelistid,rebate
  2227. INTO :ls_cusname,:ll_pricelistid,:ld_rebate_cus
  2228. FROM u_cust
  2229. Where cusid = :arg_cusid;
  2230. IF sqlca.SQLCode <> 0 THEN
  2231. rslt = 0
  2232. arg_msg = "查询操作失败,客户资料"
  2233. GOTO ext
  2234. END IF
  2235. IF arg_pricelistid > 0 THEN
  2236. ll_mxbt = 1
  2237. ll_pricelistid_arr[ll_mxbt] = arg_pricelistid
  2238. ld_rebate_arr[ll_mxbt] = ld_rebate_cus
  2239. END IF
  2240. IF if_chk_mxlist THEN //查客户价格表的,读默认的
  2241. DECLARE cur_listmx CURSOR FOR
  2242. SELECT pricelistid,rebate
  2243. FROM u_cus_pricelist_mx
  2244. WHERE cusid = :arg_cusid
  2245. Order By printid;
  2246. OPEN cur_listmx;
  2247. FETCH cur_listmx Into :ll_pricelistid_tmp,:ld_rebate_tmp;
  2248. DO WHILE sqlca.SQLCode = 0
  2249. ll_mxbt++
  2250. ll_pricelistid_arr[ll_mxbt] = ll_pricelistid_tmp
  2251. ld_rebate_arr[ll_mxbt] = ld_rebate_tmp
  2252. FETCH cur_listmx Into :ll_pricelistid_tmp,:ld_rebate_tmp;
  2253. LOOP
  2254. CLOSE cur_listmx;
  2255. // IF ll_pricelistid = 0 THEN
  2256. // rslt = 0
  2257. // arg_msg = '选择限制为"只能选客户价格表",但当前客户没有指定价格表,请检查'
  2258. // GOTO ext
  2259. // END IF
  2260. END IF
  2261. //选价格表: 1.组合配置产品按组合计算; 2.包件产品按子件计算; 3.其他常规产品直接取价
  2262. FOR ll_i = 1 To ll_mxbt //循环所有该客户有效价格表
  2263. IF ll_statusflag = 2 And arg_status <> '' And li_ifpricepack = 0 THEN //组合配置且非整套计算
  2264. //组合配置 ,计算价格
  2265. //如果不按整套,分开子件查价格
  2266. //如果价格按整套,则用整个配置信息查价格
  2267. IF uf_cmpl_price_zhpz(arg_mtrlid, ls_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid_arr[ll_i], arg_moneyid, ld_rebate_arr[ll_i], obj_price, ld_rebate, arg_msg) = 0 THEN
  2268. CONTINUE
  2269. ELSE
  2270. rtn_price = obj_price
  2271. rtn_zqrate = ld_rebate
  2272. li_suc = 1
  2273. EXIT
  2274. END IF
  2275. ELSEIF li_ifpackpro <> 0 And li_ifpricepack = 0 THEN //包件产品且非整套计算
  2276. //2.包件产品,按清单拆分, 取子件价格汇总作为包件价格
  2277. IF uf_cmpl_price_pack(arg_mtrlid, ls_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid_arr[ll_i], arg_moneyid, ld_rebate_arr[ll_i], li_price_ifpz, obj_price, ld_rebate, arg_msg) = 0 THEN
  2278. CONTINUE
  2279. ELSE
  2280. rtn_price = obj_price
  2281. rtn_zqrate = ld_rebate
  2282. li_suc = 1
  2283. EXIT
  2284. END IF
  2285. ELSE //整套计算 or 其他常规取价
  2286. //1.整套计算单价的
  2287. //2.非组合配置的
  2288. //3.非包件产品的
  2289. IF uf_cmpl_price(arg_mtrlid, ls_mtrlcode, arg_status, arg_woodcode, arg_pcode, arg_qty, ll_pricelistid_arr[ll_i], arg_moneyid, ld_rebate_arr[ll_i], li_price_ifpz, obj_price, ld_rebate, arg_msg) = 0 THEN
  2290. CONTINUE
  2291. ELSE
  2292. rtn_price = obj_price
  2293. rtn_zqrate = ld_rebate
  2294. li_suc = 1
  2295. EXIT
  2296. END IF
  2297. END IF
  2298. NEXT
  2299. //if li_suc = 1 取价成功, 统计部件选配自动换料计算差价
  2300. IF li_suc = 1 THEN
  2301. IF uof_get_mtrl_3pz_difprice(arg_mtrlid, arg_status, arg_woodcode, arg_pcode, lde_difprice, arg_msg) = 0 THEN
  2302. lde_difprice = 0
  2303. END IF
  2304. rtn_price = rtn_price + lde_difprice
  2305. // rtn_zqrate = ld_rebate
  2306. // li_suc = 1
  2307. END IF
  2308. IF li_suc = 0 THEN
  2309. rslt = 0
  2310. GOTO ext
  2311. END IF
  2312. ext:
  2313. arg_price = rtn_price
  2314. arg_rebate = rtn_zqrate
  2315. RETURN rslt
  2316. end function
  2317. on uo_cusprice.create
  2318. call super::create
  2319. TriggerEvent( this, "constructor" )
  2320. end on
  2321. on uo_cusprice.destroy
  2322. TriggerEvent( this, "destructor" )
  2323. call super::destroy
  2324. end on
  2325. event constructor;
  2326. String str_optionvalue,arg_msg
  2327. f_get_sys_option_value('056',str_optionvalue,arg_msg)
  2328. uo_option_checkprice_native = Long(str_optionvalue)
  2329. f_get_sys_option_value('238',str_optionvalue,arg_msg)
  2330. uo_option_price_rmb = Long(str_optionvalue)
  2331. f_get_sys_option_value('237',str_optionvalue,arg_msg)
  2332. uo_option_saleprice_list_rebate = Long(str_optionvalue)
  2333. end event