baolei 1 місяць тому
батько
коміт
708859bfa3

+ 1 - 1
src/main/java/com/hzy/common/constant/Constants.java

@@ -112,7 +112,7 @@ public class Constants
     /**
      * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
      */
-    public static final String[] JOB_WHITELIST_STR = { "com.hzy.framework.task" };
+    public static final String[] JOB_WHITELIST_STR = { "com.hzy.framework.task", "com.hzy.project.task" };
 
     /**
      * 定时任务违规的字符

+ 31 - 0
src/main/java/com/hzy/framework/web/service/UserService.java

@@ -0,0 +1,31 @@
+package com.hzy.framework.web.service;
+
+import com.hzy.project.system.user.domain.User;
+import com.hzy.project.system.user.service.IUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * RuoYi首创 html调用 thymeleaf 实现字典读取
+ * 
+ * @author ruoyi
+ */
+@Service("user")
+public class UserService
+{
+    @Autowired
+    private IUserService userService;
+
+    /**
+     * 查询用户数据信息
+     * 
+     * @return 参数键值
+     */
+    public List<User> getUserList()
+    {
+        return userService.selectUserList(new User());
+    }
+
+}

+ 51 - 3
src/main/java/com/hzy/project/business/balance/controller/UserBalanceController.java

@@ -1,6 +1,12 @@
 package com.hzy.project.business.balance.controller;
 
 import java.util.List;
+
+import com.hzy.common.enums.EDelFlag;
+import com.hzy.common.utils.DateUtils;
+import com.hzy.common.utils.RMBUtil;
+import com.hzy.common.utils.security.ShiroUtils;
+import com.hzy.project.business.balance.domain.UserBalanceVo;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -50,7 +56,14 @@ public class UserBalanceController extends BaseController
     public TableDataInfo list(UserBalance userBalance)
     {
         startPage();
-        List<UserBalance> list = userBalanceService.selectUserBalanceList(userBalance);
+        userBalance.setDelFlag(EDelFlag.NO.getVal());
+        List<UserBalanceVo> list = userBalanceService.selectUserBalanceVoList(userBalance);
+        list.forEach(e->{
+            e.setOpeningBalance(RMBUtil.fenToYuan(e.getOpeningBalance()));
+            e.setIncome(RMBUtil.fenToYuan(e.getIncome()));
+            e.setPayment(RMBUtil.fenToYuan(e.getPayment()));
+            e.setClosingBalance(RMBUtil.fenToYuan(e.getClosingBalance()));
+        });
         return getDataTable(list);
     }
 
@@ -63,8 +76,15 @@ public class UserBalanceController extends BaseController
     @ResponseBody
     public AjaxResult export(UserBalance userBalance)
     {
-        List<UserBalance> list = userBalanceService.selectUserBalanceList(userBalance);
-        ExcelUtil<UserBalance> util = new ExcelUtil<UserBalance>(UserBalance.class);
+        userBalance.setDelFlag(EDelFlag.NO.getVal());
+        List<UserBalanceVo> list = userBalanceService.selectUserBalanceVoList(userBalance);
+        list.forEach(e->{
+            e.setOpeningBalance(RMBUtil.fenToYuan(e.getOpeningBalance()));
+            e.setIncome(RMBUtil.fenToYuan(e.getIncome()));
+            e.setPayment(RMBUtil.fenToYuan(e.getPayment()));
+            e.setClosingBalance(RMBUtil.fenToYuan(e.getClosingBalance()));
+        });
+        ExcelUtil<UserBalanceVo> util = new ExcelUtil<UserBalanceVo>(UserBalanceVo.class);
         return util.exportExcel(list, "用户结余数据");
     }
 
@@ -98,6 +118,10 @@ public class UserBalanceController extends BaseController
     public String edit(@PathVariable("balanceId") Long balanceId, ModelMap mmap)
     {
         UserBalance userBalance = userBalanceService.selectUserBalanceByBalanceId(balanceId);
+        userBalance.setOpeningBalance(RMBUtil.fenToYuan(userBalance.getOpeningBalance()));
+        userBalance.setIncome(RMBUtil.fenToYuan(userBalance.getIncome()));
+        userBalance.setPayment(RMBUtil.fenToYuan(userBalance.getPayment()));
+        userBalance.setClosingBalance(RMBUtil.fenToYuan(userBalance.getClosingBalance()));
         mmap.put("userBalance", userBalance);
         return prefix + "/edit";
     }
@@ -111,6 +135,11 @@ public class UserBalanceController extends BaseController
     @ResponseBody
     public AjaxResult editSave(UserBalance userBalance)
     {
+        userBalance.setOpeningBalance(RMBUtil.yuanToFen(userBalance.getOpeningBalance()));
+        userBalance.setIncome(RMBUtil.yuanToFen(userBalance.getIncome()));
+        userBalance.setPayment(RMBUtil.yuanToFen(userBalance.getPayment()));
+        userBalance.setClosingBalance(RMBUtil.yuanToFen(userBalance.getClosingBalance()));
+
         return toAjax(userBalanceService.updateUserBalance(userBalance));
     }
 
@@ -125,4 +154,23 @@ public class UserBalanceController extends BaseController
     {
         return toAjax(userBalanceService.deleteUserBalanceByBalanceIds(ids));
     }
+
+    /**
+     * 修改保存用户结余
+     */
+    @RequiresPermissions("business:balance:edit")
+    @Log(title = "用户结余", businessType = BusinessType.UPDATE)
+    @PostMapping("/adjustOpening")
+    @ResponseBody
+    public AjaxResult adjustOpening(UserBalance userBalance)
+    {
+        UserBalance userBalance1 = userBalanceService.selectUserBalanceByBalanceId(userBalance.getBalanceId());
+
+        userBalance1.setOpeningBalance(RMBUtil.yuanToFen(userBalance.getOpeningBalance()));
+        userBalance1.setClosingBalance(userBalance1.getOpeningBalance().add(userBalance1.getIncome().subtract(userBalance1.getPayment())));
+        userBalance1.setUpdateBy(ShiroUtils.getLoginName());
+
+        return toAjax(userBalanceService.updateUserBalance(userBalance1));
+    }
+
 }

+ 26 - 0
src/main/java/com/hzy/project/business/balance/domain/UserBalanceVo.java

@@ -0,0 +1,26 @@
+package com.hzy.project.business.balance.domain;
+
+import com.hzy.framework.aspectj.lang.annotation.Excel;
+import com.hzy.framework.web.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * 用户结余对象 m_user_balance
+ * 
+ * @author ruoyi
+ * @date 2026-01-02
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class UserBalanceVo extends UserBalance
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 用户ID */
+    @Excel(name = "用户ID")
+    private String userName;
+
+}

+ 2 - 0
src/main/java/com/hzy/project/business/balance/mapper/UserBalanceMapper.java

@@ -2,6 +2,7 @@ package com.hzy.project.business.balance.mapper;
 
 import java.util.List;
 import com.hzy.project.business.balance.domain.UserBalance;
+import com.hzy.project.business.balance.domain.UserBalanceVo;
 
 /**
  * 用户结余Mapper接口
@@ -26,6 +27,7 @@ public interface UserBalanceMapper
      * @return 用户结余集合
      */
     public List<UserBalance> selectUserBalanceList(UserBalance userBalance);
+    public List<UserBalanceVo> selectUserBalanceVoList(UserBalance userBalance);
 
     /**
      * 新增用户结余

+ 3 - 0
src/main/java/com/hzy/project/business/balance/service/IUserBalanceService.java

@@ -2,6 +2,7 @@ package com.hzy.project.business.balance.service;
 
 import java.util.List;
 import com.hzy.project.business.balance.domain.UserBalance;
+import com.hzy.project.business.balance.domain.UserBalanceVo;
 
 /**
  * 用户结余Service接口
@@ -27,6 +28,8 @@ public interface IUserBalanceService
      */
     public List<UserBalance> selectUserBalanceList(UserBalance userBalance);
 
+    public List<UserBalanceVo> selectUserBalanceVoList(UserBalance userBalance);
+
     /**
      * 新增用户结余
      * 

+ 14 - 1
src/main/java/com/hzy/project/business/balance/service/impl/UserBalanceServiceImpl.java

@@ -2,6 +2,7 @@ package com.hzy.project.business.balance.service.impl;
 
 import java.util.List;
 import com.hzy.common.utils.DateUtils;
+import com.hzy.project.business.balance.domain.UserBalanceVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.hzy.project.business.balance.mapper.UserBalanceMapper;
@@ -35,7 +36,7 @@ public class UserBalanceServiceImpl implements IUserBalanceService
 
     /**
      * 查询用户结余列表
-     * 
+     *
      * @param userBalance 用户结余
      * @return 用户结余
      */
@@ -46,6 +47,18 @@ public class UserBalanceServiceImpl implements IUserBalanceService
     }
 
     /**
+     * 查询用户结余列表
+     *
+     * @param userBalance 用户结余
+     * @return 用户结余
+     */
+    @Override
+    public List<UserBalanceVo> selectUserBalanceVoList(UserBalance userBalance)
+    {
+        return userBalanceMapper.selectUserBalanceVoList(userBalance);
+    }
+
+    /**
      * 新增用户结余
      * 
      * @param userBalance 用户结余

+ 80 - 0
src/main/java/com/hzy/project/task/CreateBalanceTask.java

@@ -0,0 +1,80 @@
+package com.hzy.project.task;
+
+import com.hzy.common.enums.EDelFlag;
+import com.hzy.project.business.balance.domain.UserBalance;
+import com.hzy.project.business.balance.mapper.UserBalanceMapper;
+import com.hzy.project.business.balance.service.IUserBalanceService;
+import com.hzy.project.system.user.domain.User;
+import com.hzy.project.system.user.mapper.UserMapper;
+import com.hzy.project.system.user.service.IUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import com.hzy.common.utils.DateUtils;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @program: 华智昀
+ * @description: 按月创建用户结余。
+ * @author: baolei
+ * @create: 2026-01-04
+ */
+@Slf4j
+@Component("createBalanceTask")
+public class CreateBalanceTask
+{
+
+    @Autowired
+    UserMapper userMapper;
+
+    @Autowired
+    UserBalanceMapper userBalanceMapper;
+
+    public void run() {
+
+        log.info("按月创建用户结余===============>");
+
+        String duration = DateFormatUtils.format(DateUtils.getNowDate(), "yyyyMM");
+        String preDuration = DateFormatUtils.format(DateUtils.addMonths(DateUtils.getNowDate(),-1) , "yyyyMM");
+        log.info("duration={}", duration);
+        UserBalance condition = new UserBalance();
+        condition.setDuration(duration);
+
+        List<User> userList = userMapper.selectUserList(new User());
+        for (User user : userList) {
+            condition.setUserId(user.getUserId());
+            List<UserBalance> balanceList = userBalanceMapper.selectUserBalanceList(condition);
+
+            if (balanceList == null || balanceList.isEmpty()) {
+                UserBalance preBalance = new UserBalance();
+                preBalance.setUserId(user.getUserId());
+                preBalance.setDuration(preDuration);
+
+                List<UserBalance> preUserBalanceList = userBalanceMapper.selectUserBalanceList(preBalance);
+                BigDecimal preClosingBalance = BigDecimal.ZERO;
+                if (preUserBalanceList != null && !preUserBalanceList.isEmpty()) {
+                    preClosingBalance = preUserBalanceList.get(0).getClosingBalance();
+                }
+
+                UserBalance userBalance = new UserBalance();
+                userBalance.setUserId(user.getUserId());
+                userBalance.setDuration(duration);
+                userBalance.setOpeningBalance(preClosingBalance);
+                userBalance.setIncome(BigDecimal.ZERO);
+                userBalance.setPayment(BigDecimal.ZERO);
+                userBalance.setClosingBalance(preClosingBalance);
+                userBalance.setDelFlag(EDelFlag.NO.getVal());
+                userBalance.setCreateTime(DateUtils.getNowDate());
+                userBalance.setCreateBy("system");
+                userBalanceMapper.insertUserBalance(userBalance);
+
+            }
+        }
+
+        log.info("按月创建用户结余===============>");
+    }
+}

+ 37 - 3
src/main/resources/mybatis/business/UserBalanceMapper.xml

@@ -3,7 +3,7 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.hzy.project.business.balance.mapper.UserBalanceMapper">
-    
+
     <resultMap type="UserBalance" id="UserBalanceResult">
         <result property="balanceId"    column="balanceId"    />
         <result property="userId"    column="user_id"    />
@@ -18,14 +18,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="updateBy"    column="update_by"    />
         <result property="updateTime"    column="update_time"    />
     </resultMap>
+    <resultMap type="UserBalanceVo" id="UserBalanceVoResult">
+        <result property="balanceId"    column="balanceId"    />
+        <result property="userId"    column="user_id"    />
+        <result property="userName"    column="user_name"    />
+        <result property="duration"    column="duration"    />
+        <result property="openingBalance"    column="openingBalance"    />
+        <result property="income"    column="income"    />
+        <result property="payment"    column="payment"    />
+        <result property="closingBalance"    column="closingBalance"    />
+        <result property="delFlag"    column="delFlag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
 
     <sql id="selectUserBalanceVo">
         select balanceId, user_id, duration, openingBalance, income, payment, closingBalance, delFlag, create_by, create_time, update_by, update_time from m_user_balance
     </sql>
 
+    <sql id="selectUserBalanceExtraVo">
+        select mub.balanceId, mub.user_id, mub.duration, mub.openingBalance, mub.income, mub.payment, mub.closingBalance, mub.delFlag, mub.create_by, mub.create_time, mub.update_by, mub.update_time,
+               su.user_name
+        from m_user_balance mub
+        inner join hzy.sys_user su on mub.user_id = su.user_id
+    </sql>
+
     <select id="selectUserBalanceList" parameterType="UserBalance" resultMap="UserBalanceResult">
         <include refid="selectUserBalanceVo"/>
-        <where>  
+        <where>
             <if test="userId != null "> and user_id = #{userId}</if>
             <if test="duration != null  and duration != ''"> and duration = #{duration}</if>
             <if test="openingBalance != null "> and openingBalance = #{openingBalance}</if>
@@ -34,7 +56,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="closingBalance != null "> and closingBalance = #{closingBalance}</if>
         </where>
     </select>
-    
+
+    <select id="selectUserBalanceVoList" parameterType="UserBalance" resultMap="UserBalanceVoResult">
+        <include refid="selectUserBalanceExtraVo"/>
+        <where>
+            <if test="userId != null "> and mub.user_id = #{userId}</if>
+            <if test="duration != null  and duration != ''"> and mub.duration = #{duration}</if>
+            <if test="openingBalance != null "> and mub.openingBalance = #{openingBalance}</if>
+            <if test="income != null "> and mub.income = #{income}</if>
+            <if test="payment != null "> and mub.payment = #{payment}</if>
+            <if test="closingBalance != null "> and mub.closingBalance = #{closingBalance}</if>
+        </where>
+    </select>
+
     <select id="selectUserBalanceByBalanceId" parameterType="Long" resultMap="UserBalanceResult">
         <include refid="selectUserBalanceVo"/>
         where balanceId = #{balanceId}

+ 4 - 0
src/main/resources/static/ruoyi/js/ry-ui.js

@@ -1787,6 +1787,10 @@ var table = {
                 var patten = new RegExp(/^(?=.*[A-Za-z])(?=.*\d)(?=.*[~!@#\$%\^&\*\(\)\-=_\+])[A-Za-z\d~!@#\$%\^&\*\(\)\-=_\+]{6,}$/);
                 return patten.test(text);
             },
+            isCurrency : function(text){
+                var patten = new RegExp(/^-?\d+(\.\d{2})?$/);
+                return patten.test(text);
+            }
         }
     });
 })(jQuery);

+ 74 - 35
src/main/resources/templates/business/balance/balance.html

@@ -2,6 +2,7 @@
 <html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
 <head>
     <th:block th:include="include :: header('用户结余列表')" />
+    <th:block th:include="include :: bootstrap-editable-css" />
 </head>
 <body class="gray-bg">
      <div class="container-div">
@@ -13,23 +14,31 @@
                             <li>
                                 <label>用户ID:</label>
                                 <input type="text" name="userId"/>
+                                <select name="incomeType" th:with="users=${@user.getUserList()}">
+                                    <option value="">所有</option>
+                                    <option th:each="user : ${users}" th:text="${user.userName}" th:value="${user.userId}"></option>
+                                </select>
                             </li>
                             <li>
                                 <label>期初数:</label>
-                                <input type="text" name="openingBalance"/>
-                            </li>
-                            <li>
-                                <label>收入:</label>
-                                <input type="text" name="income"/>
-                            </li>
-                            <li>
-                                <label>支出:</label>
-                                <input type="text" name="payment"/>
-                            </li>
-                            <li>
-                                <label>期末数:</label>
-                                <input type="text" name="closingBalance"/>
+                                <input type="text" name="duration"/>
                             </li>
+<!--                            <li>-->
+<!--                                <label>期初数:</label>-->
+<!--                                <input type="text" name="openingBalance"/>-->
+<!--                            </li>-->
+<!--                            <li>-->
+<!--                                <label>收入:</label>-->
+<!--                                <input type="text" name="income"/>-->
+<!--                            </li>-->
+<!--                            <li>-->
+<!--                                <label>支出:</label>-->
+<!--                                <input type="text" name="payment"/>-->
+<!--                            </li>-->
+<!--                            <li>-->
+<!--                                <label>期末数:</label>-->
+<!--                                <input type="text" name="closingBalance"/>-->
+<!--                            </li>-->
                             <li>
                                 <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
                                 <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
@@ -40,15 +49,15 @@
             </div>
 
             <div class="btn-group-sm" id="toolbar" role="group">
-                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="business:balance:add">
-                    <i class="fa fa-plus"></i> 添加
-                </a>
-                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="business:balance:edit">
-                    <i class="fa fa-edit"></i> 修改
-                </a>
-                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="business:balance:remove">
-                    <i class="fa fa-remove"></i> 删除
-                </a>
+<!--                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="business:balance:add">-->
+<!--                    <i class="fa fa-plus"></i> 添加-->
+<!--                </a>-->
+<!--                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="business:balance:edit">-->
+<!--                    <i class="fa fa-edit"></i> 修改-->
+<!--                </a>-->
+<!--                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="business:balance:remove">-->
+<!--                    <i class="fa fa-remove"></i> 删除-->
+<!--                </a>-->
                 <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="business:balance:export">
                     <i class="fa fa-download"></i> 导出
                 </a>
@@ -56,9 +65,11 @@
             <div class="col-sm-12 select-table table-striped">
                 <table id="bootstrap-table"></table>
             </div>
+
         </div>
     </div>
     <th:block th:include="include :: footer" />
+     <th:block th:include="include :: bootstrap-table-editable-js" />
     <script th:inline="javascript">
         var editFlag = [[${@permission.hasPermi('business:balance:edit')}]];
         var removeFlag = [[${@permission.hasPermi('business:balance:remove')}]];
@@ -72,6 +83,7 @@
                 removeUrl: prefix + "/remove",
                 exportUrl: prefix + "/export",
                 modalName: "用户结余",
+                onEditableSave: onEditableSave,
                 columns: [{
                     checkbox: true
                 },
@@ -82,7 +94,12 @@
                 },
                 {
                     field: 'userId',
-                    title: '用户ID'
+                    title: '用户ID',
+                    visible: false
+                },
+                {
+                    field: 'userName',
+                    title: '用户名称'
                 },
                 {
                     field: 'duration',
@@ -90,7 +107,20 @@
                 },
                 {
                     field: 'openingBalance',
-                    title: '期初数'
+                    title: '期初数',
+                    editable : {
+                        type : 'text',
+                        title : '期初数',
+                        emptytext : "0",
+                        validate : function(value) {
+                            if (value.length == 0) {
+                                return '期初数不能为空';
+                            }
+                            if (!$.common.isCurrency(value)) {
+                                return '期初数应为正的金额';
+                            }
+                        }
+                    }
                 },
                 {
                     field: 'income',
@@ -103,20 +133,29 @@
                 {
                     field: 'closingBalance',
                     title: '期末数'
-                },
-                {
-                    title: '操作',
-                    align: 'center',
-                    formatter: function(value, row, index) {
-                        var actions = [];
-                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.balanceId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
-                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.balanceId + '\')"><i class="fa fa-remove"></i>删除</a>');
-                        return actions.join('');
-                    }
-                }]
+                }
+                // {
+                //     title: '操作',
+                //     align: 'center',
+                //     formatter: function(value, row, index) {
+                //         var actions = [];
+                //         actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="adjustOpening(\'' + row.balanceId + '\',' + row.openingBalance + ')"><i class="fa fa-edit"></i>编辑期初数</a> ');
+                //         actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.balanceId + '\')"><i class="fa fa-remove"></i>删除</a>');
+                //         return actions.join('');
+                //     }
+                // }
+                ]
             };
             $.table.init(options);
         });
+
+        function onEditableSave (field, row, rowIndex, oldValue, $el) {
+            $.operate.post(prefix + "/adjustOpening", {"balanceId": row.balanceId, "openingBalance": row.openingBalance}, refreshTable);
+        }
+
+        function refreshTable() {
+            $.table.refresh();
+        }
     </script>
 </body>
 </html>