From 3397dd978cef6afbb6d4fe506d5847e2324bb47b Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Thu, 18 Dec 2025 09:38:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(crm):=20=E4=BC=98=E5=8C=96=E6=8A=A5?= =?UTF-8?q?=E4=BB=B7=E5=8D=95=E6=A8=A1=E6=9D=BF=E4=B8=AD=E7=9A=84=E5=B8=81?= =?UTF-8?q?=E7=A7=8D=E4=B8=8E=E4=BB=98=E6=AC=BE=E6=96=B9=E5=BC=8F=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入 DictService 获取字典标签,替代原始付款方式和币种代码显示 - 实现根据币种名称解析对应价格单位的逻辑,提升模板显示准确性 - 新增总备注字段 totalRemark 到模板数据中 - 付款方式和币种显示支持更多币种及其代码的匹配 - 保持原有金额和交付等字段的正确处理逻辑 --- .../controller/CrmQuoteInfoController.java | 121 +++++++++++++++++- .../src/main/resources/报价单模板.xlsx | Bin 75612 -> 75645 bytes 2 files changed, 118 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/controller/CrmQuoteInfoController.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/controller/CrmQuoteInfoController.java index 851f747a..f032e705 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/controller/CrmQuoteInfoController.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/controller/CrmQuoteInfoController.java @@ -12,6 +12,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.R; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.DictService; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.excel.utils.ExcelUtil; @@ -47,6 +48,7 @@ import java.util.*; public class CrmQuoteInfoController extends BaseController { private final ICrmQuoteInfoService crmQuoteInfoService; + private final DictService dictService; /** * 查询报价单信息列表 @@ -172,13 +174,29 @@ public class CrmQuoteInfoController extends BaseController { templateData.put("title", quoteInfo.getQuoteName() != null ? quoteInfo.getQuoteName() : ""); templateData.put("quoteDate", quoteInfo.getQuoteDate() != null ? DateUtil.format(quoteInfo.getQuoteDate(), "yyyy年MM月dd日") : ""); templateData.put("taxIncludedInfo", quoteInfo.getTaxIncludedInfo() != null ? quoteInfo.getTaxIncludedInfo() : ""); - templateData.put("paymentMethod", quoteInfo.getPaymentMethod() != null ? quoteInfo.getPaymentMethod() : ""); templateData.put("deliveryPeriod", quoteInfo.getDeliveryPeriod() != null ? quoteInfo.getDeliveryPeriod() + "天" : ""); templateData.put("deliveryMethod", quoteInfo.getDeliveryMethod() != null ? quoteInfo.getDeliveryMethod() : ""); templateData.put("quoteValidity", quoteInfo.getValidDays() != null ? quoteInfo.getValidDays() + "天" : ""); + //付款方式字典 + String paymentMethodLabel = ""; + if (quoteInfo.getPaymentMethod() != null) { + String dictLabel = dictService.getDictLabel("payment_method", quoteInfo.getPaymentMethod()); + paymentMethodLabel = dictLabel != null ? dictLabel : ""; + } + templateData.put("paymentMethod", paymentMethodLabel); + //币种字典 + String currencyLabel = "人民币"; + if (quoteInfo.getCurrencyType() != null) { + String dictLabel = dictService.getDictLabel("currency_type", quoteInfo.getCurrencyType()); + if (dictLabel != null) { + currencyLabel = dictLabel; + } + } + templateData.put("currencyType", currencyLabel); - // 币种 - templateData.put("currencyType", quoteInfo.getCurrencyType() != null ? quoteInfo.getCurrencyType() : "人民币"); + // 价格单位,根据币种名称解析 + String priceUnit = resolvePriceUnit(currencyLabel); + templateData.put("priceUnit", priceUnit); // 金额相关 BigDecimal totalAmount = quoteInfo.getTotalIncludingTax() != null ? quoteInfo.getTotalIncludingTax() : BigDecimal.ZERO; @@ -191,6 +209,9 @@ public class CrmQuoteInfoController extends BaseController { templateData.put("supplierContactPhone", quoteInfo.getSupplierContactPhone() != null ? quoteInfo.getSupplierContactPhone() : ""); templateData.put("supplierContactEmail", quoteInfo.getSupplierContactEmail() != null ? quoteInfo.getSupplierContactEmail() : ""); + //总备注 + templateData.put("totalRemark", quoteInfo.getRemark() != null ? quoteInfo.getRemark() : ""); + // 准备明细数据列表(对应模板中的{.key}占位符) List materialList = new ArrayList<>(); if (CollUtil.isNotEmpty(quoteInfo.getItemsVo())) { @@ -235,5 +256,99 @@ public class CrmQuoteInfoController extends BaseController { } } + /** + * 根据币种名称解析价格单位 + * 例如:币种包含“人民币”时,价格单位为“元” + * 其他币种默认返回币种名称本身 + * + * @param currencyLabel 币种名称 + * @return 价格单位 + */ + private String resolvePriceUnit(String currencyLabel) { + if (currencyLabel == null || currencyLabel.isBlank()) { + return "元"; + } + String label = currencyLabel.trim(); + + // 人民币:使用 if 单独处理 + if (label.contains("人民币") || "CNY".equalsIgnoreCase(label) || "RMB".equalsIgnoreCase(label)) { + return "元"; + } + + // 其他币种:使用 switch,按中英文名称和常见代码匹配 + switch (label) { + case "美元": + case "美金": + case "USD": + return "美元"; + case "欧元": + case "EUR": + return "欧元"; + case "日元": + case "日币": + case "JPY": + return "日元"; + case "英镑": + case "GBP": + return "英镑"; + case "港币": + case "HKD": + return "港币"; + case "韩元": + case "韩币": + case "KRW": + return "韩元"; + case "加元": + case "CAD": + return "加元"; + case "澳元": + case "AUD": + return "澳元"; + case "瑞士法郎": + case "CHF": + return "瑞士法郎"; + case "新西兰元": + case "NZD": + return "新西兰元"; + case "新加坡元": + case "新币": + case "SGD": + return "新加坡元"; + case "泰铢": + case "THB": + return "泰铢"; + case "林吉特": + case "马来西亚林吉特": + case "MYR": + return "林吉特"; + case "印尼盾": + case "印尼卢比": + case "IDR": + return "印尼盾"; + case "菲律宾比索": + case "菲币": + case "PHP": + return "菲律宾比索"; + case "越南盾": + case "VND": + return "越南盾"; + case "新台币": + case "台币": + case "TWD": + return "新台币"; + case "卢比": + case "印度卢比": + case "INR": + return "卢比"; + case "柬埔寨瑞尔": + case "瑞尔": + case "KHR": + return "瑞尔"; + default: + // 默认直接返回币种名称 + return label; + } + } + } diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/报价单模板.xlsx b/ruoyi-modules/ruoyi-oa/src/main/resources/报价单模板.xlsx index f3ad6d212d652127bbd6f22c7a7631a05295cb1f..85f132135c4c757951cde0ce8cb82b82682b99a0 100644 GIT binary patch delta 3978 zcmY+HWmwbi+s5}*Qlvp(z|YYN>WBd%HAan6kWx}WKuH;hFk(_lw+xU@=>`c2K^jI# zjuJt-hQy>E{QsWgiR;Dn;y%vLb-y|9`?$`TL6WmUlJZml!|0S*Cl7!?hF3r!dJqWo z+}TPS<^0MOYUPZwzUSfS5EQGU(JsssG*5b=*yHuFx=0j(_v=mLpfHI460}q*B=HiN zHG6uHw`CyB-*;3KIXhQ+y?b z4i(0CpFh#+Gx<9-cNXL0UCIJ^O)(Hj*U(#%LTg>Q-F7tiXPq&{?6 zacEO@LEUtaWos-AYxqXjz7n;E|F!4&M7&rZBSiDbrkf;x2IN|DyZKnIy{e(bw7nRA zEVg4u_omAdZ|qwqYfT}W1t*as<5W!lF!Ak7v0giwVtZBz8 zg4#3r3@Sp|Q^_l$g^kY``lLTqVJVaRcBg#;YtOq!Gth4wpD6IWH#3 z)cI#E!@C`--|`d9QzTZmrM`?$yWJ^vtdC{b*)EfZs)aB}sY5cT z{kuKyg9onLb~4oymp7IjzEo!Q6E?=(RT%M>6F$D(r8wi0mh`N2Y^}b*+Cg;Mz7T$T z{>jS=!tPJnk6vcpw;zS;-+-C)mH1!^3-M@~dq)E9YJEDsR)*mm`-`y#$8{e6VC(#I z$z4X5W!wegh{v%uhQ@YJSQOosx~yt#6`C>i<@S6Zm^M=k%3EZt>nev24}_8PnaG{p znu>fYONeT`oUQt1l1dZCCff zLg%luoe+Z>^!Cxos;`jhiM^w;0DRE0U+^Ngn4l4DP;gdGFSe@}epBN8b)6+$XXee% zH8)ca$Zf5y;K8R*tE0;OslpN5&8egaDJwiZbapTH#<-JtDw*vu{YhCdKX#Ra{|vVMu$+MY6_K<2X!Q!jZdC-+!91dgie!aTJkVo~Tf;~o_;Ptg~MVHj|OH5yS z1rDbj+%nGhbIigR`@87#T&}3CsF9nmQi->8w&t^Kv%n_bLfxXcP|S=GeQ87%@kJ%d zb^v-*3(n{+V*X(yg!(e<@ZgQ%0hEmFcJg@Ws}knB;sG{7xi9ug?W-=4nyhc#AK&oE zY11Ph{t;cb!}7$OMPB-nueYU8$jZ#Gt9{(KL9G`^(LI&!)hD3|OVw-gjP1S7P|zE; zW1+kBhAM)xATS}M1tY5Qyx|&zKs)solvdg9*V7bdDJbu9baz>6;we-I=2c42SvLvQ z{Q1oG$~=i5C4y0jKUgc;t(A4|HcQORPJQqz8W(jtKjGfWz@jqRxPjvjsgng`7=HLLr|3`XiLOA+{U$XDC(MI)A8Udgc)vbETtOfZ z+z3lV?7iV8<++xXtyZZIMjRwso*UpfL3;5b@jX2>d0=3mQea0QuW6QN7=w40F*&C- zl1$?+ONXF>5(b3Vt(TUMH8n7cGb_ib}``xEN*%gy_Qd^|_ zEEt6;4Lep>!qh)PB9Tf+P2>n)^2za{C+aVT|ajN7A<@TTCel&JB) z$`4j3_F&V`i$C4kC}9sbmLzjk5VLSN+L+%7ih8` zv2N#r&aoRXl}Gb?q#&H6R`==$U!FjC?Kexez6|;i7@MQOCWa9e(ad;ojqQN_=o%Yo z3Jme;G23>nb%v_xz0Y%@4U#Z?4wwad7^9-Im16X%@gJ9n_}}cA+lH0){pLeL&-=|M z|F-Xc+l;^x+ddYCnB6fbOO=;hNBuae%f2@TS=S1gVV zKC*wG*$bUiIgdbNtx*z^}0>&L_+*(oElH{ zg5UUx@x6n&l%33&XuFy1F!zWdPW>OADnE#pR8%E3_#Bz+U4NBNJ_A(tOLn~xM&ZdP z4YQqMb|Owe$(mYV-dMw^1e06bab7Ky1|B1LPfV4aBwr4g7Ck-0deHLIo-{3c7R_}l z<1v>qy|RchrSeTMub>`nkck-g7Fx05Nw|$&@s4Z@BXxn=NA+yn)^QlK|FG}DNgzpR zwL&VmL|9LB;JNC*4kZUv+V3oXs<2)j>_`~Ph>uQ|87@*9-Y#Fe!;qmYrwk}_DP#WL z67nu58>RZxY1H(|-krlV4g2&KlbD82@$VzP+O=@t&4bH&X2m7K(Vy!&=hSJ_ODm`p zh)%Vg8=kc3WqWhe?JV|9^9Q@j;2l|6@0!jHIPDvL`(~Luo~X!x7_;=$sbonHJCim;9Xv6`dY6x-%Y9d^g2FbXj#*6pHgDR zu(VzBG}6=TAhMOsX<60a%S^E`+Ui@^rZf$e2VsAd!5gu4vua&;uA1KMDaN;NC&_MKiqdX2%Z#D5MVmrncDV_!#TamCga z+L^5n@fAXGt32~G-Y*vZj(&=J;n~$wTXf@A52g+8$lxITlToB%O#>%oj$1oQbw%^c zW+(SXz!`;*Q3TFRVVr^~qB4tCmDuLj_2!>l4t_Y+FVu~7IgW0Bc5#56KAf_v{6Qo^ z1QC8uq4n`~I}GT3H1PTt8zPU4!VC7E)FF|s`#u@hu-*@+``+e5Z?pDO0`H_M5eI3~ zs@(XT+R`)vSldEbxhx(3taeSE1j9Rm7mSj}}+ z6Q%JfW2OQ}ZR8=w!L4TSQ{m(@lUd{P7H8=-e_EB+7nt;W1qs)e<$NfJ>J>uvgXck2 zD0Q5uTsaU6{@$aDv_u{%_DR=ddux}7>M`e;R^Cij_j>kf(0o!t&6s1^CUrR}<2!Y7 z+Ex7+=Gfl}n-VH45^p=e?`}tBN?q}cX&etr%PAsyj!PBmYQ`P7p&&0?MGOLp&bq`N zv^b0YD z&@-prN|scu0M6qkk{9V$9QZ@7e3#IU+q$uzi^Hf@i2?mN{_`C#a>~X7YSnnoDb?Yl z=@tSP0z(-V#|mv%TRSZ4%U)kQ4|tw-PMbH^Jo)O)YVS)|A2Bwk`E?5U9NiO`>j=k7 zn-o5J%L`hl976p4=N_1 z)((@4Sdpz|F%mTKGr+NY98%(@553)9L4p(v4&=>o!5k=Dl$M8!M;85KaKF*SW+tcH znzfK{64lTasIg;_+u&v*{Ec=KU{<>tA;ZuU;6(S2?#`sxjgo8fWC1?*;_h0+y6}f5%B|&ABE|JYtSQvd?v}%0w-p1VZ`&? zAw~D_bM9}Q7|>ToI;xnbbOeY>0nQ7isMH*COT&jtt2RK!s+-m`JQ~UPsc4-pPmVu> z`$;i%fC@d$P(0ZQ6TOZCtGYK=--^hfhay#-brz49D&8z@&kPO`++G70E4~$reC0o` zPs=3Vw|%N7D9a01^S)=pbpvy&TERRSrYi6rV5-H<$Ua;$t}0sxJ?N^vlL!kvFBa(~ z_LwKCN2($B$vHwN$r>yY6}3-F>F2&7Xb^^4*$ZuADh0^OUR^Hh5AyQ9#Ph9VL36s)%vID{ ze?Pa$V>ro;%wVMt|$1m!VQ)?iH|vQQM$UXtD?hc z78AksnO(!^M8alskutRIs#`<^VU?;A(f`?svl4~Bi zwBE{(StW%9jY*u>Od3y9B-F(~4>fz;I++Iqo6NRkA7uCH&@R-GjH8T@1@rD>qiQF|Jt!&9s^l+Dk6SSkOub2c(7YrW2Vb2* zX!Jh;72vuGFpxq9#A6?F0dSxQ8^r~PUBiI^kU7fQ!4-;i;Q_d?TU@|P(*HzLtT8vB z2b^Kcxi8g**gbAQ_zHv*%fkbR1FG1kJb)_Tfz9Lrq<|wVo(GTz1hDM9fHshYb>Ib* zfog0eFCYQnv1_~lKl}gu^b{b_U;qCt00g=0>{vlQKmiEHI`9DxfIe(K-z7!B&hcGR z|L=YLMK0@K3W2@J56A$=SQCCg8nDME@?XwK#ZL1B672uUdE_9_TMiJ2^{3tAF^vOhD$mZ6(|8~=|ov94#`#b7iFdhNX+wr+H3QCB-ZKJal%Xax7>er>M zoD}Y_FkF#d>yJyqBKvTW^lsNagWJUt3vVsfAx_w?bxrNu5?`ub88VsWE4F(6j_A;T z$WH`h7#cd5s5q}(p9RcRIffY}4xiVMD_4OCCwF)_%avv8SJ-ACYa6S+lJdfg;8%kx zHk*||ZfXk5(aY*O5$mi~*PJ>j%3;u%65X+5i6C4wlFgAZE73Owjacs{Rp6<2A z!4$?k_Rn50>o0LGDCNp*OQzb(_i`VSO68;0e zdav*0js6cvBCnx$obADpP?Ngv`dQe^FuNHG>vxk{K?5JWy|7O2PW!*U*6`lIY`s&H zv#@^nITd+wA8TH}7x-Y~-p{1e0!nu!kMdF%q+-)|OHIa?)_`@Ps2}sw2)eTc`Bquy zY;{@d=Jt0vVl|l5_F$?uNt9N#n42PdZ@R*Js`U!pmf*`>mI|DP;ALv%{KG7XEppO& zT=O5V$K7-6yGLN}(J(s?71?0K7-zYGO$esp^uhvvCpL6ozXZcj>#kijr?&DAEkBat?-Yr*Q~ev|wS6y6ic1q7v5hW7&tv9Zv; zYfpxdMQ|TJVz1p^kH3*loUn^(4twus&92!5#xBT}yjUtA^u2|(eQqhIW5dAMD`AOi zIM>mJruSI6>(AY7IRCQYl!nE+O5Lsrw45o2cGN;`;+ru_3)C;zsMtl+j4%psF>!Zx zR1@g^g#-O6Fj);7!*F43_`t7OWSv9)YT?4S1UwqPhZ0c&B?Bk8mI&5MZ-yJSrdg|qa$%;yf8|+N**B5P;oLCf^URR(Il~4 zk5PfJ6Hc?Wqx_$X6R4ctxG z6y8n1#w0mmWw3?PT^0ro4pCvfy9tGH?w%$Q`avKob$6P4j{=DS+Kj{fr|>wKld7e=UQOUg=|*`Gp;Vt;{^^(S-sWf$v-%-rer%C*?dM zEc_{2RD>L*nfxa3Z3w0^j<@~R01(;LnV@O;PNe+qep}sc*;<-3vsVE7eVPxcB z7lrDL+^zv_e!%8n!BjBZ6{_m*Fddr@kX8C?ir5}+Y=w!)s4sX+25JEVq7h8Dxn4@VaZjksQmU=M(ZbJy=m_$9^@XTf zTHNsH(-7dxj-mXGpm!u52b~#5xki^E9*?^^M8=bN?1KWbc8iYAY4Iv2rdKTOHrj;`=A-ueE- zzQ&7T&V)PLjVqfx_L{6HF(}@gE9Ysy)4_*^p$je*EVVwW--@@1M;5pSCDCyZ%9e2t z#D$ZC+ZZhZM~IkePbG*b4ojb{sGxI7KC}s6cCWW%;4&^tK(I$UGC{bGhv4~$J>y=O z$VjCUS6r8SQTOruj_Pp2-I@D*p^tj(%h}@h%Sd8+xe1CTW(C|aeMRX%|4&ZzfYDcJ z$k@~;w3}nUr?I{s^xm$dNsX$vN*s;5P!8fhGsC(ka7jLWv#2;1%{}NyZm8Km>gO(v z)5lDSTdm`rPMEh~sHeD#1y^Q~PQLHxb1FYFYi`YX<0f~mgtT@Cd$G1!eLtV=K$nU@hK>PCzWanOiYVEN;)$w~c_)AKCNJZHNIm)pOM43ounR-*;RLRCI`C6G{_sh4?Qed#1zW^vfg zmmDeYsFd3zE7J|MOMksXqY=~|Y96C2PE)A|B>GM04^Hpw4VJ5n3q{Ek28Z43-HOc_ z>0h_UsZGC)n!gYpit%q7i64a3J z3nHIxe`%*X9NeuVCZ9#rdxKZkwHkEEx_2dw9*@tdKE>bb^+*-s2UlncYDC@) zcTTmLt`xk~flkSLZ@fMtn_F4~jp=FrQO7V-ZW1*7MM@pRFh8=j} z`4_cP>T{JDFo{jWu>x+*9RlkDGZIC2f>q`+75`-T);{@bR3aUT9tgpzrt`2eAtbGn zr0GqHO~GV&QKe;WeNF!95CdLBMc_*106lKQv{ao?GOq_-St~GyDoD6^ogm}M`-Q<( z{MxZD&onzD2)UAuUmer*>W~-zptaPhQEtqG)ZP^Gpnhv~NhDYvBb z>4aN{r$o90Iw!s4)s59dn+c`xvS_?WO>DMiCPFX&x@W?a;T^T!k)szH)1K5p|Lo;$ zC(;TRg}$BY^r~IZa>yJhuU`zeXXx@dxLEo)?e5RSpD3q72@6u7Zfix8uFI#)ts;%d z8*z3H?QeM>?~Lx%KKOd1B5NBf5xbvSfZ5 z5t*U?PMFaJoJi$C``7a*g^dp~yJRMVvToG8W{SULO25iUidsofoNnzxH$otNc#4c<-kn5HXn$*+>)gjPfMSgn;GO-YBRc0wU!nnlSkG4jy=9;JqP-k_eZBti z_HVvD!p^|iddMlqEE`M`Vpdo<)uo#qfK(zPiUG3D$QyjIY^rHugTu@`G+h7IKKt>7 zTf2{E)OC9l>5lWdi}&K)u<~c=A5ZX2q7&KA6W&w8CA%hiQ2?l+~2 zY~3kdER@4m;k906)gravaUR8)C*K>f4gn{JQTqZxM&=jdb_Hgu_+yUf4;3!zJzIz< z9ojB1o|g}(#v4FYA4{2|Jdv98D=oy;#>R2^OrOEc44;BxCEJ7Mxu5ZBW&RHFmED45 zty+zyEFQs$Vw<%nx(I_Sr50Z}A3XYQALkQ*LS-I$O2LapWj&s3?CsA-%1a8~J^?7H zU$Sv%i4)=(b8{>i28Bho-2V2Ztceg}D!>0k&0an5abzs#Q-$)Y8d=|Be3!o~nKMxa zV;s|zL*&MPp!VX>Vfd?pfNm