1 line
12 KiB
JavaScript
1 line
12 KiB
JavaScript
import{i as e}from"./rolldown-runtime-BgaNhQyE.js";import{Dr as t,t as n}from"./jsx-runtime-CRBytmvs.js";import{t as r}from"./request--UCyt0wo.js";import{t as i}from"./typography-DRFhazK9.js";import{B as a,I as o,c as s}from"./lodash-DNhu68T6.js";import{n as c,t as l}from"./table-BXi9q3AE.js";import{t as u}from"./space-Cu4QVMgQ.js";import{t as d}from"./button-BILozH6U.js";import{r as f}from"./DoubleRightOutlined-Blfli1UU.js";import{l as ee}from"./XinForm-BWtl160T.js";import{t as p}from"./card-DU2T2-YW.js";import{t as m}from"./form-B3R3kIqp.js";import{t as te}from"./image-zUz1CRv3.js";import{t as h}from"./input-CHcsaDtX.js";import{r as g}from"./PictureOutlined-CB8Pr7jP.js";import{t as _}from"./tag-DBV1bHre.js";import{t as v}from"./XinTable-BHebVDbz.js";import{t as y}from"./level-D21a7wOc.js";import{n as b}from"./category-MmrJkdbs.js";import{t as x}from"./supplier-BstAcwv7.js";var S=e(t(),1),ne={0:{text:`下架`,color:`default`},1:{text:`上架`,color:`success`}};async function re(e){return r({url:`/product/goods/priceMatrix`,method:`get`,params:e})}async function ie(e){return r({url:`/product/goods/batchPrice`,method:`put`,data:{updates:e}})}var C=n(),{Title:ae,Text:w}=i,T=0,E=1,D=[{value:T,label:`固定价`},{value:E,label:`成本百分比`}],O=e=>Math.round(e*100)/100,k=e=>e.map(e=>({...e,disabled:!!e.children?.length,children:e.children?.length?k(e.children):e.children})),A=e=>e.map(e=>({...e,selectable:!e.children?.length,children:e.children?.length?A(e.children):e.children})),j=({form:e,levels:t})=>{let n=m.useWatch(`prices`,e)??[],r=Number(m.useWatch(`cost_price`,e)??0);if(t.length===0)return(0,C.jsx)(w,{type:`secondary`,children:`暂无可配置的客户等级,请先到「客户等级」中新增`});let i=(t,r)=>{let i=n.filter(e=>e.level_id!==t);i.push({...r,level_id:t}),e.setFieldValue(`prices`,i)},o=t=>{e.setFieldValue(`prices`,n.filter(e=>e.level_id!==t))},s=(e,t,n)=>{if(n===E){if(!(r>0)){g.warning(`请先在商品信息中设置成本价,才能按成本百分比计价`);return}let a=Number(t?.price??0);i(e,{price_type:n,percent:a>0?O((a/r-1)*100):null})}else{let a=Number(t?.percent??0);i(e,{price_type:n,price:r>0&&a>0?O(r*(1+a/100)):t?.price??null})}};return(0,C.jsx)(u,{wrap:!0,children:t.map(e=>{if(e.id==null)return null;let t=n.find(t=>t.level_id===e.id),c=t?.price_type??T;return(0,C.jsxs)(u,{wrap:!1,children:[(0,C.jsx)(w,{style:{width:60,display:`inline-block`,textAlign:`right`},children:e.name}),(0,C.jsx)(f,{size:`middle`,style:{width:110},value:c,options:D,onChange:n=>s(e.id,t,n)}),c===E?(0,C.jsx)(a,{min:0,precision:0,suffix:`%`,placeholder:`上浮百分点`,value:t?.percent??null,onChange:n=>{if(n===null){o(e.id);return}i(e.id,{price_type:E,percent:n,price:r>0?O(r*(1+n/100)):t?.price})},style:{width:160}}):(0,C.jsx)(a,{min:0,precision:2,suffix:`¥`,placeholder:`未设定`,value:t?.price??null,onChange:t=>{if(t===null){o(e.id);return}i(e.id,{price_type:T,price:t})},style:{width:160}})]},e.id)})})},M=()=>{let[e,t]=(0,S.useState)([]),[n,r]=(0,S.useState)([]),[i,f]=(0,S.useState)([]),m=(0,S.useMemo)(()=>k(i),[i]),D=(0,S.useMemo)(()=>A(i),[i]),[M,N]=(0,S.useState)(void 0),P=(0,S.useRef)(null);(0,S.useEffect)(()=>{P.current?.reset()},[M]);let[oe,F]=(0,S.useState)(!1),[I,L]=(0,S.useState)(!1),[R,z]=(0,S.useState)(!1),[B,V]=(0,S.useState)([]),[H,U]=(0,S.useState)(1),[W,G]=(0,S.useState)(20),[K,se]=(0,S.useState)(0),[q,ce]=(0,S.useState)([]),[J,le]=(0,S.useState)(``),[Y,ue]=(0,S.useState)(void 0),X=(0,S.useRef)({}),Z=(0,S.useRef)({}),Q=(0,S.useRef)({});(0,S.useEffect)(()=>{y().then(e=>t(e.data.data??[])),x().then(e=>r(e.data.data??[])),b().then(e=>f(e.data.data??[]))},[]);let $=async(e=J,t=Y,n=H,r=W)=>{L(!0);try{let i=await re({keyword:e||void 0,category_id:t,page:n,pageSize:r}),a=i.data.data?.rows??[];a.forEach(e=>{Q.current[e.id]=Number(e.cost_price??0)});let o=a.map(e=>{let t={...e};return Z.current[e.id]!==void 0&&(t.cost_price=Z.current[e.id]),Object.entries(X.current).forEach(([n,r])=>{let[i,a]=n.split(`:`);String(e.id)===i&&(t[`price_${a}`]=r.price)}),t});V(o),se(i.data.data?.total??0),ce(i.data.data?.levels??[])}finally{L(!1)}},de=()=>{F(!0),U(1),G(20),$(``,void 0,1,20)},fe=(e,t,n)=>{V(r=>r.map(r=>{if(r.id!==e)return r;let i=Number(r[`price_type_${t}`]??T);return X.current[`${e}:${t}`]={price:n,price_type:i},{...r,[`price_${t}`]:n}}))},pe=(e,t)=>{Z.current[e]=t,V(n=>n.map(n=>{if(n.id!==e)return n;let r={...n,cost_price:t},i=Number(t??0);return Object.keys(r).forEach(t=>{if(!t.startsWith(`percent_`))return;let n=t.replace(`percent_`,``);if(X.current[`${e}:${n}`]||Number(r[`price_type_${n}`])!==E)return;let a=Number(r[t]??0);r[`price_${n}`]=i>0?O(i*(1+a/100)):null}),r}))},me=async()=>{let e=[];Object.entries(Z.current).forEach(([t,n])=>{n!=null&&e.push({product_id:Number(t),cost_price:n})});for(let[t,n]of Object.entries(X.current)){if(n.price===null||n.price===void 0)continue;let[r,i]=t.split(`:`),a=Number(r);if(n.price_type===E){let t=Z.current[a]??Q.current[a]??0;if(!(t>0)){g.error(`商品 #${a} 未设置成本价,无法保存百分比价格`);return}e.push({product_id:a,level_id:Number(i),price_type:E,percent:O((n.price/t-1)*100),price:n.price})}else e.push({product_id:a,level_id:Number(i),price_type:T,price:n.price})}if(e.length===0){g.info(`没有需要保存的价格调整`);return}z(!0);try{await ie(e),g.success(`已更新 ${e.length} 条价格,受影响门店将收到通知`),X.current={},Z.current={},await $()}finally{z(!1)}},he=[{title:`商品`,dataIndex:`name`,fixed:`left`,width:160,render:(e,t)=>(0,C.jsxs)(`div`,{children:[(0,C.jsx)(`div`,{className:`font-medium`,children:e}),(0,C.jsxs)(w,{type:`secondary`,className:`text-xs`,children:[t.spec,t.unit?` / ${t.unit}`:``]})]})},{title:`成本价`,key:`cost_price`,fixed:`left`,width:130,render:(e,t)=>(0,C.jsx)(a,{size:`small`,min:0,precision:2,prefix:`¥`,value:t.cost_price,onChange:e=>pe(t.id,e),className:`w-32`})},...q.map(e=>({title:e.name,key:`price_${e.id}`,width:150,render:(t,n)=>{let r=Number(n[`price_type_${e.id}`]??T)===E,i=Number(n[`percent_${e.id}`]??0);return(0,C.jsxs)(`div`,{children:[(0,C.jsx)(a,{size:`small`,min:0,precision:2,prefix:`¥`,value:n[`price_${e.id}`],onChange:t=>fe(n.id,e.id,t),className:`w-32`}),r&&(0,C.jsxs)(`div`,{className:`text-xs text-gray-400`,children:[`成本上浮 `,i,`%`]})]})}}))],ge={api:`/product/goods`,columns:[{title:`ID`,dataIndex:`id`,hideInForm:!0,hideInSearch:!0,width:70,align:`center`},{title:`商品图片`,dataIndex:`image_ids`,valueType:`image`,fieldProps:{action:`/product/goods/upload`,maxWidth:3e3,maxHeight:3e3,maxSize:10,mode:`multiple`,maxCount:5,changeType:`id`},render:(e,t)=>!t.images_arr||t.images_arr?.length<=0?`-`:(0,C.jsx)(u,{wrap:!1,children:t.images_arr.map(e=>(0,C.jsx)(te,{src:e.preview_url,width:60,height:60,style:{objectFit:`cover`,borderRadius:4}},e.id))}),align:`center`,hideInSearch:!0,colProps:{span:24}},{title:`商品名称`,dataIndex:`name`,valueType:`text`,colProps:{span:24},required:!0,render:(e,t)=>(0,C.jsxs)(`div`,{children:[(0,C.jsx)(`div`,{className:`mb-1.5`,children:t.name}),(0,C.jsx)(`div`,{className:`text-[#999] text-[12px]`,children:t.remark})]}),rules:[{required:!0,message:`请输入商品名称`}]},{title:`商品描述`,dataIndex:`remark`,valueType:`text`,hideInSearch:!0,hideInTable:!0,colProps:{span:24}},{title:`规格/包规`,dataIndex:`spec`,valueType:`text`,hideInSearch:!0,align:`center`},{title:`单位`,dataIndex:`unit`,valueType:`text`,hideInSearch:!0,initialValue:`斤`,align:`center`},{title:`分类`,dataIndex:`category_id`,valueType:`treeSelect`,required:!0,align:`center`,rules:[{required:!0,message:`请选择分类`}],fieldProps:{treeData:m,fieldNames:{label:`name`,value:`id`,children:`children`},treeDefaultExpandAll:!0,showSearch:!0,treeNodeFilterProp:`name`,placeholder:`选择末级分类`},hideInSearch:!0,render:(e,t)=>t.category?(0,C.jsx)(_,{color:`cyan`,children:t.category.name}):`-`},{title:`供应商`,dataIndex:`supplier_id`,valueType:`select`,hideInSearch:!0,align:`center`,fieldProps:{options:n.map(e=>({label:e.name,value:e.id})),showSearch:!0,optionFilterProp:`label`,allowClear:!0,placeholder:`默认供应商(可选)`},render:(e,t)=>t.supplier?.name??`-`},{title:`图文详情`,dataIndex:`content`,valueType:`richText`,hideInSearch:!0,hideInTable:!0,colProps:{span:24},fieldProps:{height:400,groupId:11,placeholder:`输入商品图文详情,支持插入图片`}},{title:`成本价`,dataIndex:`cost_price`,valueType:`digit`,hideInSearch:!0,align:`center`,fieldProps:{min:0,precision:2,prefix:`¥`},render:(e,t)=>Number(t.cost_price??0)>0?`¥${t.cost_price}`:(0,C.jsx)(w,{type:`secondary`,children:`未设置`})},{title:`等级价格`,dataIndex:`prices`,hideInForm:!0,hideInSearch:!0,width:420,align:`center`,render:(e,t)=>(0,C.jsx)(u,{wrap:!0,children:t.prices?.length?t.prices.map(e=>(0,C.jsxs)(_,{color:`geekblue`,title:Number(e.price_type)===E?`按成本价上浮 ${e.percent}%`:void 0,children:[e.level?.name??`等级${e.level_id}`,(0,C.jsxs)(`span`,{style:{color:`red`,marginLeft:5},children:[`¥`,e.actual_price??e.price??`未设定`]})]},e.id)):`-`})},{title:`排序`,dataIndex:`sort`,valueType:`digit`,hideInSearch:!0,fieldProps:{min:0},align:`center`},{title:`状态`,dataIndex:`status`,valueType:`radioButton`,initialValue:1,fieldProps:{options:[{value:1,label:`上架`},{value:0,label:`下架`}]},render:(e,t)=>{let n=ne[t.status??1];return(0,C.jsx)(_,{color:n?.color,children:n?.text})},align:`center`},{title:`等级价格设置`,dataIndex:`prices`,hideInTable:!0,hideInSearch:!0,colProps:{span:24},fieldRender:t=>(0,C.jsx)(j,{form:t,levels:e})},{title:`创建时间`,dataIndex:`created_at`,hideInForm:!0,hideInSearch:!0,align:`center`}],rowKey:`id`,accessName:`product.goods`,tableRef:P,scroll:{x:1200},actionBarRender:e=>[e.add,e.search,(0,C.jsx)(d,{icon:(0,C.jsx)(s,{}),onClick:de,children:`价格矩阵`},`matrix`),e.keywordSearch],formProps:{grid:!0,colProps:{span:12},rowProps:{gutter:20},layout:`vertical`},requestParams:e=>({...e,category_id:M}),modalProps:{width:800,centered:!0,classNames:{body:`overflow-y-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden h-[80vh]`}}};return(0,C.jsxs)(C.Fragment,{children:[(0,C.jsxs)(`div`,{className:`mb-5`,children:[(0,C.jsx)(ae,{level:3,children:`商品列表`}),(0,C.jsx)(w,{type:`secondary`,children:`商品档案与多等级价格体系;「价格矩阵」支持按等级批量调价,调价后自动通知受影响门店。`})]}),(0,C.jsxs)(`div`,{className:`flex items-start gap-4`,children:[(0,C.jsxs)(p,{style:{width:200},title:`商品分类`,children:[(0,C.jsx)(`div`,{className:`cursor-pointer rounded-2xl mb-2 px-2 h-6 leading-6 ${M===void 0?`bg-blue-50`:`hover:bg-gray-50`}`,onClick:()=>{N(void 0)},children:`全部商品`}),(0,C.jsx)(c,{showLine:!0,blockNode:!0,onSelect:e=>N(Number(e[0])),treeData:D,selectedKeys:M?[M]:void 0,fieldNames:{title:`name`,key:`id`,children:`children`}})]}),(0,C.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,C.jsx)(v,{...ge})})]}),(0,C.jsxs)(o,{title:`价格矩阵 · 批量调价`,open:oe,onClose:()=>F(!1),size:1200,extra:(0,C.jsxs)(u,{children:[(0,C.jsx)(d,{onClick:()=>$(),children:`刷新`}),(0,C.jsx)(d,{type:`primary`,loading:R,onClick:me,children:`保存调价`})]}),children:[(0,C.jsxs)(u,{className:`mb-4`,wrap:!0,children:[(0,C.jsx)(ee,{style:{width:180},placeholder:`按分类筛选`,allowClear:!0,treeDefaultExpandAll:!0,fieldNames:{label:`name`,value:`id`,children:`children`},treeData:i,value:Y,onChange:e=>{ue(e),U(1),$(J,e,1,W)}}),(0,C.jsx)(h.Search,{style:{width:240},placeholder:`搜索品名/规格`,allowClear:!0,value:J,onChange:e=>le(e.target.value),onSearch:e=>{U(1),$(e,Y,1,W)}})]}),(0,C.jsx)(l,{rowKey:`id`,size:`small`,loading:I,columns:he,dataSource:B,pagination:{current:H,pageSize:W,total:K,showSizeChanger:!0,pageSizeOptions:[20,50,100],showTotal:e=>`共 ${e} 件商品`,onChange:(e,t)=>{U(e),G(t),$(J,Y,e,t)}},scroll:{x:q.length*150+290}})]})]})};export{M as default}; |