假设有一个商品表,有1000条数据,要实现一键设置价格

img

假设有一个商品表,有1000条数据,要实现一键设置价格,前端传过来,K,V(金额,比例)格式数据,比如{K:7,V:50},{K:8,V:30},{K:9,V:50}请问如何根据前端传过来的数据按照比例,给1000件商品设置价格,(后端并不知道前端要传几组金额比例)

最好能贴上代码,或解释具体实现步骤

价格如何计算 ,举例说一下{k:7,v:50} 价格应该如何变化

1.假设你拿到的数组[{k: 7, v: 30}, {k: 8, v: 30}, {k: 8, v: 40}]
前提是总数不超过100%
2.总数为1000个,然后通过 循环乘比例v,设置每个的价格
3.随便前端传多少组 比例都不会超过100%,那就不用考虑他传了多少组,因为是循环出来的

这种不确定的肯定要用到循环,可以用map双列集合的key和value结构,也可以自定义一个对象,一个属性为金额,一个属性修改的比列。然后放到list集合遍历,第一次遍历可以加一下比列如果超过100就返回不成功,如果不超过再遍历,这次遍历是为了修改数据库。这时把比列算出来,全为具体的数据条数。然后发sql修改,如果id有序的 可以用这种嵌套循环生成指定数量的id 用in的方式修改 where ID in( '10001','1002','1003')。 如果数据库id无序,可以先发一条查询语句,单位字段只要id,比如第一次查询到1000条,采取数据截断的方式,截断出指定数量的id ,然后发送修改语句。稍微难点在sql这里,我电脑不在旁边,不好帮你写,大概说一下思路


--SQL2012+
--构造测试数据,这里的number等于你的关键字
SELECT number,CONVERT(INT,null) AS price INTO #tmp  FROM master..spt_values WHERE type='P' AND number BETWEEN 1 AND 1000

/*解析单价和比例,形成中间表,F_Split为自定义函数,字符串拆分
单价 截止 开始
7  0.5  0
8  0.8  0.5
9  1    0.8 
*/
SELECT [1],SUM(CONVERT(NUMERIC(18,4),[2])) OVER(ORDER BY id)/100.0 AS [4],SUM(CONVERT(NUMERIC(18,4),[3])) OVER(ORDER BY id)/100.0 AS [5] INTO #rst
FROM 
(
    SELECT id,value,STUFF([1],1,2,'') AS [1],STUFF([2],1,2,'') AS [2] ,LAG( STUFF([2],1,2,''),1,0) OVER(ORDER BY id) AS [3]   FROM 
    (
        SELECT a.id,a.value,b.id AS idx,REPLACE(REPLACE(b.value,'{',''),'}','') AS valuex 
        FROM dbo.F_Split('{K:7,V:50};{K:8,V:30};{K:9,V:20}',';') a OUTER APPLY dbo.F_Split(a.value,',') b
    ) p
    PIVOT
    (
        MAX(valuex) for
        idx IN([1],[2])
    ) q
) a
 

--按比例更新单价
WITH ct
AS
(
    SELECT * ,1.0*ROW_NUMBER() OVER(ORDER BY number) /COUNT(number) OVER()  AS p FROM #tmp 
)
UPDATE ct SET ct.price = [1] 
FROM #rst
WHERE p >[5] AND p<=[4]

--删除测试数据
DROP TABLE #rst
DROP TABLE #tmp

这个配置类就可以解决

1、获取前端数据,解析成List
2、遍历List,首先检验百分比相加是否等于100%,同时计算每组的个数,存入原List里;
3、定义起始=0,遍历List
写SQL语句更新: update '商品表' set '价格'=?limit '起始','个数';
起始+=个数;