大大的豆芽 2 月之前
父节点
当前提交
0f4e4dc886
共有 26 个文件被更改,包括 775 次插入621 次删除
  1. 4 4
      admin-ui/.env.development
  2. 10 0
      admin-ui/src/api/settlement/statistics.js
  3. 1 1
      admin-ui/src/utils/request.js
  4. 26 24
      admin-ui/src/views/order/statistics/index.vue
  5. 209 209
      admin-ui/src/views/settlement/bill/index.vue
  6. 299 248
      admin-ui/src/views/settlement/bill/storeSettlement.vue
  7. 6 4
      yiqi-admin/src/main/java/com/yiqi/admin/controller/core/SettlementManageBillController.java
  8. 16 0
      yiqi-admin/src/main/java/com/yiqi/admin/controller/settlement/SettlementStoreStatisticsController.java
  9. 14 5
      yiqi-admin/src/main/java/com/yiqi/task/SettlementTask.java
  10. 8 1
      yiqi-common/src/main/java/com/yiqi/app/domain/AppUserBillMstr.java
  11. 0 4
      yiqi-common/src/main/java/com/yiqi/app/service/IAppUserBillMstrService.java
  12. 1 1
      yiqi-common/src/main/java/com/yiqi/common/enums/OrderSourceType.java
  13. 10 2
      yiqi-common/src/main/java/com/yiqi/core/domain/SettlementStoreStatistics.java
  14. 6 2
      yiqi-common/src/main/java/com/yiqi/core/service/ISettlementStoreStatisticsService.java
  15. 1 1
      yiqi-common/src/main/java/com/yiqi/recharge/domain/dto/BillMstrOrderDTO.java
  16. 9 1
      yiqi-common/src/main/java/com/yiqi/recharge/domain/dto/ConsumeOrderDTO.java
  17. 0 9
      yiqi-common/src/main/java/com/yiqi/recharge/service/IRechargePasswordCardService.java
  18. 9 3
      yiqi-common/src/main/java/com/yiqi/system/domain/SysStore.java
  19. 3 4
      yiqi-core/src/main/java/com/yiqi/app/service/impl/AppUserBillMstrServiceImpl.java
  20. 45 7
      yiqi-core/src/main/java/com/yiqi/core/service/impl/SettlementManageBillServiceImpl.java
  21. 40 0
      yiqi-core/src/main/java/com/yiqi/core/service/impl/SettlementManageFactoryServiceImpl.java
  22. 42 2
      yiqi-core/src/main/java/com/yiqi/core/service/impl/SettlementManageStoreServiceImpl.java
  23. 11 0
      yiqi-core/src/main/java/com/yiqi/core/service/impl/SettlementStoreStatisticsServiceImpl.java
  24. 2 2
      yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderActivityServiceImpl.java
  25. 2 3
      yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderPurchaseGoodsServiceImpl.java
  26. 1 84
      yiqi-core/src/main/java/com/yiqi/recharge/service/impl/RechargePasswordCardServiceImpl.java

+ 4 - 4
admin-ui/.env.development

@@ -5,10 +5,10 @@ VUE_APP_TITLE = zparty管理系统
 ENV = 'development'
 
 
-# VUE_APP_BASE_API_HOST = 'http://localhost:9801'
-# VUE_APP_BASE_API = 'http://localhost:9801'
-VUE_APP_BASE_API_HOST = 'http://139.224.65.227:8091/prod-api'
-VUE_APP_BASE_API = 'http://139.224.65.227:8091/prod-api'
+VUE_APP_BASE_API_HOST = 'http://localhost:9801'
+VUE_APP_BASE_API = 'http://localhost:9801'
+# VUE_APP_BASE_API_HOST = 'http://139.224.65.227:8091/prod-api'
+# VUE_APP_BASE_API = 'http://139.224.65.227:8091/prod-api'
 # VUE_APP_BASE_API_HOST = 'http://192.168.98.9:9801'
 # VUE_APP_BASE_API = 'http://192.168.98.9:9801/'
 

+ 10 - 0
admin-ui/src/api/settlement/statistics.js

@@ -9,6 +9,16 @@ export function listStatistics(query) {
   })
 }
 
+export function listStatisticsByStore(query) {
+  return request({
+    url: '/settlement/store/statistics/list/bystore',
+    method: 'get',
+    params: query
+  })
+}
+
+
+
 // 查询门店统计详细
 export function getStatistics(id) {
   return request({

+ 1 - 1
admin-ui/src/utils/request.js

@@ -52,7 +52,7 @@ service.interceptors.request.use(config => {
       const interval = 1000;                         // 间隔时间(ms),小于此时间视为重复提交
 
       if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url && s_url !== '/common/uploadOSS') {
-        const message = '数据正在处理,请勿重复提交';
+        const message = '数据正在处理,请勿重复请求';
         console.warn(`[${s_url}]: ` + message)
         return Promise.reject(new Error(message))
       } else {

+ 26 - 24
admin-ui/src/views/order/statistics/index.vue

@@ -39,10 +39,34 @@
         </template>
       </el-table-column>
 
+      <!-- 总计统计 -->
+      <el-table-column label="总计" align="center">
+        <el-table-column label="订单总数" align="center" width="100">
+          <template slot-scope="scope">
+            {{ scope.row.clothOrderCount + scope.row.goodsOrderCount }}
+          </template>
+        </el-table-column>
+        <el-table-column label="订单总额" align="center" width="120">
+          <template slot-scope="scope">
+            {{ (scope.row.clothOrderAmount + scope.row.goodsOrderAmount).toFixed(2) }}
+          </template>
+        </el-table-column>
+        <el-table-column label="总支付金额" align="center" width="120">
+          <template slot-scope="scope">
+            {{ calculateTotalPayAmount(scope.row) }}
+          </template>
+        </el-table-column>
+        <el-table-column label="总退款金额" align="center" width="120">
+          <template slot-scope="scope">
+            {{ calculateTotalRefundAmount(scope.row) }}
+          </template>
+        </el-table-column>
+      </el-table-column>
+
       <!-- 洗衣订单统计 -->
       <el-table-column label="洗衣订单" align="center">
         <el-table-column label="订单数" align="center" prop="clothOrderCount" width="90" />
-        <el-table-column label="衣物件数" align="center" prop="clothItemCount" width="90" />
+        <el-table-column label="衣物件数" align="center" prop="clothCount" width="90" />
         <el-table-column label="订单总额" align="center" prop="clothOrderAmount" width="100" />
         <el-table-column label="支付金额" align="center">
           <el-table-column label="微信支付" align="center" prop="clothWechatAmount" width="100" />
@@ -76,29 +100,7 @@
         </el-table-column>
       </el-table-column>
 
-      <!-- 总计统计 -->
-      <el-table-column label="总计" align="center">
-        <el-table-column label="订单总数" align="center" width="100">
-          <template slot-scope="scope">
-            {{ scope.row.clothOrderCount + scope.row.goodsOrderCount }}
-          </template>
-        </el-table-column>
-        <el-table-column label="订单总额" align="center" width="120">
-          <template slot-scope="scope">
-            {{ (scope.row.clothOrderAmount + scope.row.goodsOrderAmount).toFixed(2) }}
-          </template>
-        </el-table-column>
-        <el-table-column label="总支付金额" align="center" width="120">
-          <template slot-scope="scope">
-            {{ calculateTotalPayAmount(scope.row) }}
-          </template>
-        </el-table-column>
-        <el-table-column label="总退款金额" align="center" width="120">
-          <template slot-scope="scope">
-            {{ calculateTotalRefundAmount(scope.row) }}
-          </template>
-        </el-table-column>
-      </el-table-column>
+      
     </el-table>
 
     <pagination

+ 209 - 209
admin-ui/src/views/settlement/bill/index.vue

@@ -1,227 +1,227 @@
 <template>
-    <div class="app-container">
-        <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-            <el-form-item prop="title">
-                <el-input v-model="queryParams.title" placeholder="请输入账单标题" clearable @keyup.enter.native="handleQuery" />
-            </el-form-item>
-            <el-form-item>
-                <el-date-picker v-model="monthTime" value-format="yyyy-MM" type="month" placeholder="选择月"> </el-date-picker>
-            </el-form-item>
-            <el-form-item>
-                <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
-                <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
-            </el-form-item>
-        </el-form>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="账单标题" prop="title">
+        <el-input v-model="queryParams.title" placeholder="请输入账单标题" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="月份">
+        <el-date-picker v-model="monthTime" value-format="yyyy-MM" type="month" placeholder="选择月">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
+          <el-option v-for="dict in dict.type.settlement_status_type" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
 
-        <el-row :gutter="10" class="mb8">
-            <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-        </el-row>
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['settlement:bill:add']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="success" plain icon="el-icon-check" size="mini" :disabled="multiple" @click="handleBatchConfirm"
+          v-hasPermi="['settlement:bill:confirm']">批量确认</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
 
-        <el-table v-loading="loading" fit highlight-current-row border stripe :data="billList" @selection-change="handleSelectionChange">
-            <!--      <el-table-column type="selection" width="55" align="center" fixed="left"/>-->
-            <el-table-column label="编号" align="center" prop="id" width="100px" />
-            <el-table-column label="标题" align="center" prop="title" />
-            <el-table-column label="开始时间" align="center" prop="beginTime" />
-            <el-table-column label="结束时间" align="center" prop="endTime" />
-            <el-table-column label="提交人" align="center" prop="createBy" />
-            <el-table-column label="门店数量" align="center" prop="storeNum" />
-            <el-table-column label="原材料备用金(元)" align="center" prop="materialImprestAmount" width="170" />
-            <el-table-column label="系统维护费(元)" align="center" prop="systemMaintenanceAmount" width="150" />
-            <el-table-column label="洗衣费(元)" align="center" prop="washClothAmount" />
-            <el-table-column label="结算(元)" align="center" prop="settlementAmount" />
-            <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="150">
-                <template slot-scope="scope">
-                    <el-button type="text" icon="el-icon-edit" @click="storeDetail(scope.row)">门店结算详情</el-button>
-                    <el-button type="text" icon="el-icon-edit" @click="factoryDetail(scope.row)" v-hasPermi="['settlement:bill:query']">工厂结算详情</el-button>
-                </template>
-            </el-table-column>
-        </el-table>
+        <Page uri="/mapi/settlement/bill/listSettlementBill" :request-params="queryParams" ref="pagination">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="账单标题" align="center" prop="title" />
+      <el-table-column label="开始时间" align="center" prop="beginTime" width="100px" />
+      <el-table-column label="结束时间" align="center" prop="endTime" width="100px" />
+      <el-table-column label="门店数量" align="center" prop="storeNum" width="80px" />
+      <el-table-column label="原材料备用金(元)" align="center" prop="materialImprestAmount" />
+      <el-table-column label="系统维护费(元)" align="center" prop="systemMaintenanceAmount" />
+      <el-table-column label="洗衣费(元)" align="center" prop="washClothAmount" />
+      <el-table-column label="结算(元)" align="center" prop="settlementAmount" />
+      <el-table-column label="状态" align="center" prop="status" width="100px">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.settlement_status_type" :value="scope.row.status" />
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="250">
+        <template slot-scope="scope">
+          <el-button type="text" icon="el-icon-edit" @click="storeDetail(scope.row)">门店结算详情</el-button>
+          <el-button type="text" icon="el-icon-edit" @click="factoryDetail(scope.row)" v-hasPermi="['settlement:bill:query']">工厂结算详情</el-button>
+          <el-button type="text" icon="el-icon-refresh" @click="handleReverse(scope.row)" v-if="scope.row.status === '1'"
+            v-hasPermi="['settlement:bill:reverse']">红冲</el-button>
+        </template>
+      </el-table-column>
+    </Page>
 
-        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
 
-        <!-- 添加或修改结算费率对话框 -->
-        <el-dialog :title="title" :visible.sync="open" size="30%" append-to-body>
-            <el-row :gutter="15">
-                <el-form ref="form" :model="form" :rules="rules" label-width="100px">
-                    <el-col :span="24">
-                        <el-form-item label="选择月份" required>
-                            <el-date-picker v-model="form.month" value-format="yyyy-MM" type="month" placeholder="选择月"> </el-date-picker>
-                        </el-form-item>
-                        <el-form-item label="账单标题" prop="title">
-                            <el-input v-model="form.title" />
-                        </el-form-item>
-                    </el-col>
-                </el-form>
-            </el-row>
-
-            <div slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="submitForm" style="margin-left: 5%">提交</el-button>
-                <el-button @click="cancel">取 消</el-button>
-            </div>
-        </el-dialog>
-    </div>
+    <!-- 添加或修改对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="账单标题" prop="title">
+          <el-input v-model="form.title" placeholder="请输入账单标题" />
+        </el-form-item>
+        <el-form-item label="月份" prop="month">
+          <el-date-picker v-model="form.month" type="month" placeholder="选择月份" value-format="yyyy-MM" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
 </template>
 
 <script>
-import { listRate, getRate, delRate, addRate, updateRate, updateRateStatus } from '@/api/settlement/rate'
-import { allOrg } from '@/api/system/store'
-import { insertSettlementBill, listSettlementBill } from '@/api/settlement/bill'
+import { listSettlementBill, getSettlementBill, delSettlementBill, addSettlementBill, confirmBatchSettlementBill, reverseSettlementBill } from '@/api/settlement/bill'
 
 export default {
-    name: 'bill',
-    data() {
-        return {
-            monthTime: '',
-            // 遮罩层
-            loading: true,
-            // 选中数组
-            ids: [],
-            // 非单个禁用
-            single: true,
-            // 非多个禁用
-            multiple: true,
-            // 显示搜索条件
-            showSearch: true,
-            // 总条数
-            total: 0,
-            // 结算费率表格数据
-            billList: [],
-            // 弹出层标题
-            title: '',
-            // 是否显示弹出层
-            open: false,
-            // 查询参数
-            queryParams: {
-                pageNum: 1,
-                pageSize: 10,
-                title: null
-            },
-            // 表单参数
-            form: {},
-            // 表单校验
-            rules: {
-                title: [{ required: true, message: '账单标题不能为空', trigger: 'blur' }]
-            },
-            sourceType: null
-        }
+  name: 'SettlementBill',
+  dicts: ['settlement_status_type'],
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 结算单表格数据
+      billList: [],
+      // 弹出层标题
+      title: '',
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        title: null,
+        status: null,
+        monthTime: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        title: [
+          { required: true, message: '账单标题不能为空', trigger: 'blur' }
+        ],
+        month: [
+          { required: true, message: '月份不能为空', trigger: 'blur' }
+        ]
+      },
+      // 月份
+      monthTime: ''
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    /** 查询结算单列表 */
+    getList() {
+      if (this.monthTime) {
+        this.queryParams.monthTime = this.monthTime
+      }
+      this.$nextTick(() => {
+        this.$refs.pagination.handleSearch(true)
+      })
     },
-    created() {
-        this.getList()
+    // 取消按钮
+    cancel() {
+      this.open = false
+      this.reset()
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        title: null,
+        month: null
+      }
+      this.resetForm('form')
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.monthTime = null
+      this.resetForm('queryForm')
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        title: null,
+        status: null,
+        monthTime: null
+      }
+      this.handleQuery()
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
     },
-    methods: {
-        /** 查询结算费率列表 */
-        getList() {
-            this.loading = true
-            this.queryParams.monthTime = this.monthTime
-            listSettlementBill(this.queryParams).then((response) => {
-                this.billList = response.data.records
-                this.total = response.data.total
-                this.loading = false
-            })
-        },
-        // 取消按钮
-        cancel() {
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset()
+      this.open = true
+      this.title = '添加结算单'
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs['form'].validate(valid => {
+        if (valid) {
+          addSettlementBill(this.form).then(response => {
+            this.$modal.msgSuccess('新增成功')
             this.open = false
-            this.reset()
-        },
-        // 表单重置
-        reset() {
-            this.form = {
-                id: null,
-                sourceType: null,
-                orgId: null,
-                factoryRate: null,
-                materialRate: null,
-                manageRate: null,
-                depositRate: null,
-                otherStoreRate: null,
-                payRate: null
-            }
-            this.resetForm('form')
-        },
-        /** 搜索按钮操作 */
-        handleQuery() {
             this.getList()
-        },
-        /** 重置按钮操作 */
-        resetQuery() {
-            this.monthTime = null
-            this.queryParams.monthTime = null
-            this.resetForm('queryForm')
-            this.handleQuery()
-        },
-        // 多选框选中数据
-        handleSelectionChange(selection) {
-            this.ids = selection.map((item) => item.id)
-            this.single = selection.length !== 1
-            this.multiple = !selection.length
-        },
-        /** 新增按钮操作 */
-        handleAdd() {
-            this.reset()
-            this.open = true
-            this.title = '添加结算费率'
-        },
-        /** 修改按钮操作 */
-        handleUpdate(row) {
-            this.reset()
-            const id = row.id || this.ids
-            getRate(id).then((response) => {
-                this.form = response.data
-                this.open = true
-                this.title = '修改结算费率'
-            })
-        },
-        /** 提交按钮 */
-        submitForm() {
-            this.$refs['form'].validate((valid) => {
-                if (valid) {
-                    insertSettlementBill(this.form).then((response) => {
-                        this.$modal.msgSuccess('新增成功')
-                        this.open = false
-                        this.getList()
-                    })
-                }
-            })
-        },
-        /** 删除按钮操作 */
-        handleDelete(row) {
-            const ids = row.id || this.ids
-            this.$modal
-                .confirm('是否确认删除结算费率编号为"' + ids + '"的数据项?')
-                .then(function () {
-                    return delRate(ids)
-                })
-                .then(() => {
-                    this.getList()
-                    this.$modal.msgSuccess('删除成功')
-                })
-                .catch(() => {})
-        },
-        /** 导出按钮操作 */
-        handleExport() {
-            this.download(
-                'mapi/settlement/rate/export',
-                {
-                    ...this.queryParams
-                },
-                `rate_${new Date().getTime()}.xlsx`
-            )
-        },
-        checkClose(done) {
-            this.$confirm('是否关闭表单,关闭后数据将丢失?')
-                .then(function () {
-                    done()
-                })
-                .then(() => {})
-                .catch(() => {})
-        },
-        factoryDetail(row) {
-            this.$tab.openPage(row.title + '的工厂结算详情', '/settlement/factory/' + row.id)
-        },
-        storeDetail(row) {
-            this.$tab.openPage(row.title + '的门店结算详情', '/settlement/store/' + row.id)
+          })
         }
+      })
+    },
+    /** 批量确认按钮操作 */
+    handleBatchConfirm() {
+      if (this.ids.length === 0) {
+        this.$message.warning('请至少选择一条记录')
+        return
+      }
+      this.$modal.confirm('确认要批量确认所选择的结算单吗?').then(() => {
+        return confirmBatchSettlementBill(this.ids)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('批量确认成功')
+      }).catch(() => { })
+    },
+    /** 红冲按钮操作 */
+    handleReverse(row) {
+      this.$modal.confirm('是否确认红冲该结算单?').then(() => {
+        return reverseSettlementBill({ id: row.id })
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('红冲成功')
+      }).catch(() => { })
+    },
+    /** 跳转到门店结算详情 */
+    storeDetail(row) {
+      this.$tab.openPage(row.title + '的门店结算详情', '/settlement/store/' + row.id)
+    },
+    /** 跳转到工厂结算详情 */
+    factoryDetail(row) {
+      this.$tab.openPage(row.title + '的工厂结算详情', '/settlement/factory/' + row.id)
     }
+  }
 }
 </script>

+ 299 - 248
admin-ui/src/views/settlement/bill/storeSettlement.vue

@@ -1,7 +1,20 @@
 <template>
     <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="门店名称" prop="orgName">
+        <el-input v-model="queryParams.orgName" placeholder="请输入门店名称" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
+          <el-option v-for="dict in dict.type.settlement_status_type" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+      </el-form-item>
+    </el-form>
         <el-table v-loading="loading" fit highlight-current-row border stripe :data="billList" @selection-change="handleSelectionChange">
-            <el-table-column label="门店名称" align="center" prop="orgName" width="130px"> </el-table-column>
+            <el-table-column label="门店名称" align="center" prop="orgName" width="130px" />
             <el-table-column label="账单标题" align="center" prop="title" width="100px" />
             <el-table-column label="开始时间" align="center" prop="beginTime" width="100px" />
             <el-table-column label="结束时间" align="center" prop="endTime" width="100px" />
@@ -19,15 +32,20 @@
             <el-table-column label="未开卡卡密金额" align="center" prop="unopenedCardPasswordAmount" width="140px" />
             <el-table-column label="已付卡密押金" align="center" prop="paidCardPasswordDeposit" width="130px" />
             <el-table-column label="已付福利押金" align="center" prop="paidWelfareDeposit" width="100px" />
-            <el-table-column label="支付宝/微信" align="center" prop="alipayAndWechatAmount" width="100px" />
+      <el-table-column label="支付宝/微信" align="center" prop="alipayAndWechatAmount" width="130px">
+        <template slot-scope="scope">
+          <el-tag size="mini" type="success">微信实收:¥{{ scope.row.wechatAmount || '0' }}</el-tag>
+          <el-tag size="mini" type="warning">支付宝实收:¥{{ scope.row.alipayAmount || '0' }}</el-tag>
+        </template> 
+      </el-table-column>
             <el-table-column label="原材料备用金" align="center" prop="materialImprestAmount" width="100px" />
+      <el-table-column label="原材料剩余金额" align="center" prop="materialImprestRemainAmount" width="120px" />
             <el-table-column label="系统维护费" align="center" prop="systemMaintenanceAmount" width="100px" />
             <el-table-column label="洗衣费" align="center" prop="washClothAmount" width="100px" />
             <el-table-column label="顺丰快递费" align="center" prop="sfExpressAmount" width="100px" />
             <el-table-column label="跨店结算金" align="center" prop="crossStoreSettlementAmount" width="100px" />
             <el-table-column label="超额订货金额" align="center" prop="overOrderingAmount" width="100px" />
             <el-table-column label="结算金额" align="center" prop="settlementAmount" width="100px" />
-
             <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="150">
                 <template slot-scope="scope">
                     <el-button type="text" @click="getDetail(scope.row)">详情</el-button>
@@ -37,169 +55,170 @@
 
         <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
 
-        <el-dialog :title="title" :visible.sync="open" size="50%" append-to-body v-if="settlementManageStore">
-            <el-row :gutter="15">
-                <el-card>
-                    <el-descriptions :column="3" direction="vertical" border :label-style="{ 'text-align': 'center' }" :content-style="{ 'text-align': 'center', color: '#ff4949', 'font-size': '15px', 'font-weight': 'bold' }">
-                        <el-descriptions-item label="门店名称" :span="3">{{ sysStore == null ? '--' : sysStore.name }}</el-descriptions-item>
-                        <el-descriptions-item label="开始时间">{{ settlementManageStore == null ? '--' : settlementManageStore.beginTime }}</el-descriptions-item>
-                        <el-descriptions-item label="结束时间">{{ settlementManageStore == null ? '--' : settlementManageStore.endTime }}</el-descriptions-item>
-                        <el-descriptions-item label="会员剩余金额(元)"> {{ settlementManageStore.memberBalance == null ? '0' : settlementManageStore.memberBalance }}</el-descriptions-item>
-                        <el-descriptions-item>
-                            <span slot="label">
-                                <el-tooltip content="应付押金 =会员剩余金额 *费率" placement="top">
-                                    <i class="el-icon-question"></i>
-                                </el-tooltip>
-                                应付押金(元)
-                            </span>
-                            {{ settlementManageStore.payableDeposit == null ? '0' : settlementManageStore.payableDeposit }}</el-descriptions-item
-                        >
-                        <el-descriptions-item label="已付押金(元)"> {{ settlementManageStore.paidDeposit == null ? '0' : settlementManageStore.paidDeposit }}</el-descriptions-item>
-                        <el-descriptions-item label="福利金额(元)"> {{ settlementManageStore.welfareAmount == null ? '0' : settlementManageStore.welfareAmount }}</el-descriptions-item>
-                        <el-descriptions-item>
-                            <span slot="label">
-                                <el-tooltip content="应付福利押金=福利金额 *费率" placement="top">
-                                    <i class="el-icon-question"></i>
-                                </el-tooltip>
-                                福利押金(元)
-                            </span>
-                            {{ settlementManageStore.welfareDeposit == null ? '0' : settlementManageStore.welfareDeposit }}</el-descriptions-item
-                        >
-                        <el-descriptions-item>
-                            <span slot="label">
-                                <el-tooltip content="应付卡密押金=未开卡卡密金额 *费率" placement="top">
-                                    <i class="el-icon-question"></i>
-                                </el-tooltip>
-                                卡密押金(元)
-                            </span>
-                            {{ settlementManageStore.cardPasswordDeposit == null ? '0' : settlementManageStore.cardPasswordDeposit }}</el-descriptions-item
-                        >
-                        <el-descriptions-item label="未开卡卡密金额(元)"> {{ settlementManageStore.unopenedCardPasswordAmount == null ? '0' : settlementManageStore.unopenedCardPasswordAmount }}</el-descriptions-item>
-                        <el-descriptions-item label="已付福利押金(元)"> {{ settlementManageStore.paidWelfareDeposit == null ? '0' : settlementManageStore.paidWelfareDeposit }}</el-descriptions-item>
-                        <el-descriptions-item label="已付卡密押金(元)"> {{ settlementManageStore.paidCardPasswordDeposit == null ? '0' : settlementManageStore.paidCardPasswordDeposit }}</el-descriptions-item>
-                        <el-descriptions-item>
-                            <span slot="label">
-                                <el-tooltip content="支付宝/微信=所有收银*(1-费率)" placement="top">
-                                    <i class="el-icon-question"></i>
-                                </el-tooltip>
-                                支付宝/微信(元)
-                            </span>
-                            {{ settlementManageStore.alipayAndWechatAmount == null ? '0' : settlementManageStore.alipayAndWechatAmount }}</el-descriptions-item
-                        >
-                        <el-descriptions-item>
-                            <span slot="label">
-                                <el-tooltip content="原材料备用金=订单金额*费率" placement="top">
-                                    <i class="el-icon-question"></i>
-                                </el-tooltip>
-                                原材料备用金(元)
-                            </span>
-                            {{ settlementManageStore.materialImprestAmount == null ? '0' : settlementManageStore.materialImprestAmount }}</el-descriptions-item
-                        >
-                        <el-descriptions-item>
-                            <span slot="label">
-                                <el-tooltip content="系统维护费=订单金额*费率" placement="top">
-                                    <i class="el-icon-question"></i>
-                                </el-tooltip>
-                                系统维护费(元)
-                            </span>
-                            {{ settlementManageStore.systemMaintenanceAmount == null ? '--' : settlementManageStore.systemMaintenanceAmount }}</el-descriptions-item
-                        >
-                        <el-descriptions-item>
-                            <span slot="label">
-                                <el-tooltip content="洗衣费=洗衣单项总金额*费率" placement="top">
-                                    <i class="el-icon-question"></i>
-                                </el-tooltip>
-                                洗衣费(元)
-                            </span>
-                            {{ settlementManageStore.washClothAmount == null ? '0' : settlementManageStore.washClothAmount }}</el-descriptions-item
-                        >
-                        <el-descriptions-item>
-                            <span slot="label">
-                                <el-tooltip content="顺丰快递费=顺丰订单数*9" placement="top">
-                                    <i class="el-icon-question"></i>
-                                </el-tooltip>
-                                顺丰快递费(元)
-                            </span>
-                            {{ settlementManageStore.sfExpressAmount == null ? '0' : settlementManageStore.sfExpressAmount }}</el-descriptions-item
-                        >
-                        <el-descriptions-item>
-                            <span slot="label">
-                                <el-tooltip content="[跨店结算金=(本店卡:洗衣*费率-异店卡:洗衣*费率)+(本店卡:零售*费率-异店卡:零售*费率)+(本店卡:app*费率-异店卡:app*费率)+(本店卡:第三方*费率-异店卡:第三方*费率)]" placement="top">
-                                    <i class="el-icon-question"></i>
-                                </el-tooltip>
-                                跨店结算金(元)
-                            </span>
-                            {{ settlementManageStore.crossStoreSettlementAmount == null ? '0' : settlementManageStore.crossStoreSettlementAmount }}</el-descriptions-item
-                        >
-                        <el-descriptions-item label="超额订货金额(元)"> {{ settlementManageStore.overOrderingAmount == null ? '0' : settlementManageStore.overOrderingAmount }}</el-descriptions-item>
-                        <el-descriptions-item>
-                            <span slot="label">
-                                <el-tooltip content="(结算金额=支付宝/微信-(应付押金-已付押金)-(应付福利押金+卡密押金-已付福利押金-已付卡密押金)-原材料备用金-系统维护费-洗衣费-顺丰快递费-跨店结算金-超额订货金额)" placement="top">
-                                    <i class="el-icon-question"></i>
-                                </el-tooltip>
-                                结算金额(元)
-                            </span>
-                            {{ settlementManageStore.settlementAmount == null ? '0' : settlementManageStore.settlementAmount }}</el-descriptions-item
-                        >
-                        <el-descriptions-item label="是否确认数据符合">{{ getCheckName }}</el-descriptions-item>
-                        <el-descriptions-item label="数据确认时间">{{ settlementManageStore.dataCheckTime == null ? '暂无数据' : settlementManageStore.dataCheckTime }}</el-descriptions-item>
-                        <el-descriptions-item label="数据确认说明">{{ settlementManageStore.dataCheckDesc == null ? '暂无数据' : settlementManageStore.dataCheckDesc }}</el-descriptions-item>
-                    </el-descriptions>
-                </el-card>
-                <el-card>
-                    <el-form ref="form" :model="form" :rules="rules" label-width="50%" style="margin-top: 10px" v-if="settlementManageStore">
-                        <el-col :span="24">
-                            <el-form-item label="收取余额押金" prop="settlePaidDeposit">
-                                <el-input-number v-model="form.settlePaidDeposit" :controls="false" placeholder="请输入收取余额押金" :disabled="getCanEdit" :max="9999999" />
-                            </el-form-item>
-                        </el-col>
-                        <el-col :span="24">
-                            <el-form-item label="收取福利押金" prop="settleWelfareDeposit">
-                                <el-input-number v-model="form.settleWelfareDeposit" :controls="false" placeholder="请输入收取余额押金" :disabled="getCanEdit" :max="9999999" />
-                            </el-form-item>
-                        </el-col>
-                        <el-col :span="24">
-                            <el-form-item label="收取卡密押金" prop="settleGetCardPasswordDeposit">
-                                <el-input-number v-model="form.settleGetCardPasswordDeposit" :controls="false" placeholder="请输入收取余额押金" :disabled="getCanEdit" :max="9999999" />
-                            </el-form-item>
-                        </el-col>
-                        <el-col :span="24">
-                            <el-form-item label="收取材料费" prop="settleMaterialImprestAmount">
-                                <el-input-number v-model="form.settleMaterialImprestAmount" :controls="false" placeholder="请输入收取余额押金" :disabled="getCanEdit" :max="9999999" />
-                            </el-form-item>
-                        </el-col>
-                        <el-col :span="24">
-                            <el-form-item label="清算【实际结算金额】" prop="realSettlementAmount">
-                                <el-input-number v-model="form.realSettlementAmount" :controls="false" placeholder="请输入收取余额押金" :disabled="getCanEdit" :max="9999999" />
-                            </el-form-item>
-                        </el-col>
-                        <el-col :span="24">
-                            <el-form-item label="清算备注" prop="settleRemark">
-                                <el-input v-model="form.settleRemark" style="width: auto" type="textarea" :rows="4" placeholder="请输入清算备注" :disabled="getCanEdit" />
-                            </el-form-item>
-                        </el-col>
-                    </el-form>
-                    <div>
-                        <el-button type="primary" @click="restartCountSettlementAmount" v-if="settlementManageStore.status != '1'" style="margin-left: 50%; margin-top: 10px">重新计算实际结算金额</el-button>
-                    </div>
-                </el-card>
+    <el-dialog :title="title" :visible.sync="open" width="80%" append-to-body v-if="settlementManageStore">
+      <el-row :gutter="20">
+        <!-- 基本信息 -->
+        <el-col :span="24">
+          <el-card class="box-card">
+            <div slot="header">
+              <span>基本信息</span>
+            </div>
+            <el-descriptions :column="3" border>
+              <el-descriptions-item label="门店名称">{{ sysStore && sysStore.name || '--' }}</el-descriptions-item>
+              <el-descriptions-item label="开始时间">{{ settlementManageStore && settlementManageStore.beginTime || '--' }}</el-descriptions-item>
+              <el-descriptions-item label="结束时间">{{ settlementManageStore && settlementManageStore.endTime || '--' }}</el-descriptions-item>
+            </el-descriptions>
+          </el-card>
+        </el-col>
+
+        <!-- 收支明细 -->
+        <el-col :span="24">
+          <el-card class="box-card">
+            <div slot="header">
+              <span>收支明细</span>
+            </div>
+            <el-row :gutter="20">
+              <el-col :span="8">
+                <el-statistic title="支付宝/微信收入" :value="settlementManageStore.alipayAndWechatAmount" :precision="2">
+                  <template slot="suffix">元</template>
+                </el-statistic>
+              </el-col>
+              <el-col :span="8">
+                <el-statistic title="微信实收" :value="settlementManageStore.wechatAmount" :precision="2">
+                  <template slot="suffix">元</template>
+                </el-statistic>
+              </el-col>
+              <el-col :span="8">
+                <el-statistic title="支付宝实收" :value="settlementManageStore.alipayAmount" :precision="2">
+                  <template slot="suffix">元</template>
+                </el-statistic>
+              </el-col>
             </el-row>
+          </el-card>
+        </el-col>
+
+        <!-- 押金信息 -->
+        <el-col :span="12">
+          <el-card class="box-card">
+            <div slot="header">
+              <span>押金信息</span>
+              <el-tooltip content="押金 = 会员剩余金额 * 费率" placement="top">
+                <i class="el-icon-question"></i>
+              </el-tooltip>
+            </div>
+            <el-form ref="depositForm" :model="form" label-width="120px">
+              <el-form-item label="会员剩余金额">
+                <el-input-number v-model="settlementManageStore.memberBalance" :disabled="true" :precision="2" :controls="false" style="width: 180px"></el-input-number>
+              </el-form-item>
+              <el-form-item label="应付押金">
+                <el-input-number v-model="settlementManageStore.payableDeposit" :disabled="true" :precision="2" :controls="false" style="width: 180px"></el-input-number>
+              </el-form-item>
+              <el-form-item label="收取押金" prop="settlePaidDeposit">
+                <el-input-number v-model="form.settlePaidDeposit" :disabled="getCanEdit" :precision="2" :controls="false" style="width: 180px" @change="handleAmountChange"></el-input-number>
+              </el-form-item>
+            </el-form>
+          </el-card>
+        </el-col>
+
+        <!-- 福利信息 -->
+        <el-col :span="12">
+          <el-card class="box-card">
+            <div slot="header">
+              <span>福利信息</span>
+              <el-tooltip content="福利押金 = 福利金额 * 费率" placement="top">
+                <i class="el-icon-question"></i>
+              </el-tooltip>
+            </div>
+            <el-form ref="welfareForm" :model="form" label-width="120px">
+              <el-form-item label="福利金额">
+                <el-input-number v-model="settlementManageStore.welfareAmount" :disabled="true" :precision="2" :controls="false" style="width: 180px"></el-input-number>
+              </el-form-item>
+              <el-form-item label="应付福利押金">
+                <el-input-number v-model="settlementManageStore.welfareDeposit" :disabled="true" :precision="2" :controls="false" style="width: 180px"></el-input-number>
+              </el-form-item>
+              <el-form-item label="收取福利押金" prop="settleWelfareDeposit">
+                <el-input-number v-model="form.settleWelfareDeposit" :disabled="getCanEdit" :precision="2" :controls="false" style="width: 180px" @change="handleAmountChange"></el-input-number>
+              </el-form-item>
+            </el-form>
+          </el-card>
+        </el-col>
+
+        <!-- 卡密信息 -->
+        <el-col :span="12">
+          <el-card class="box-card">
+            <div slot="header">
+              <span>卡密信息</span>
+              <el-tooltip content="卡密押金 = 未开卡卡密金额 * 费率" placement="top">
+                <i class="el-icon-question"></i>
+              </el-tooltip>
+            </div>
+            <el-form ref="cardForm" :model="form" label-width="120px">
+              <el-form-item label="未开卡卡密金额">
+                <el-input-number v-model="settlementManageStore.unopenedCardPasswordAmount" :disabled="true" :precision="2" :controls="false" style="width: 180px"></el-input-number>
+              </el-form-item>
+              <el-form-item label="应付卡密押金">
+                <el-input-number v-model="settlementManageStore.cardPasswordDeposit" :disabled="true" :precision="2" :controls="false" style="width: 180px"></el-input-number>
+              </el-form-item>
+              <el-form-item label="收取卡密押金" prop="settleGetCardPasswordDeposit">
+                <el-input-number v-model="form.settleGetCardPasswordDeposit" :disabled="getCanEdit" :precision="2" :controls="false" style="width: 180px" @change="handleAmountChange"></el-input-number>
+              </el-form-item>
+            </el-form>
+          </el-card>
+        </el-col>
 
-            <div slot="footer" class="dialog-footer" v-if="settlementManageStore.status != '1'">
-                <el-button type="primary" @click="submitForm" style="margin-left: 5%">确认结算</el-button>
-                <el-button @click="cancel">取 消</el-button>
+        <!-- 其他费用 -->
+        <el-col :span="12">
+          <el-card class="box-card">
+            <div slot="header">
+              <span>其他费用</span>
             </div>
-        </el-dialog>
+            <el-form ref="otherForm" :model="form" label-width="120px">
+              <el-form-item label="原材料备用金">
+                <el-input-number v-model="settlementManageStore.materialImprestAmount" :disabled="true" :precision="2" :controls="false" style="width: 180px"></el-input-number>
+              </el-form-item>
+              <el-form-item label="收取材料费" prop="settleMaterialImprestAmount">
+                <el-input-number v-model="form.settleMaterialImprestAmount" :disabled="getCanEdit" :precision="2" :controls="false" style="width: 180px" @change="handleAmountChange"></el-input-number>
+              </el-form-item>
+            </el-form>
+          </el-card>
+        </el-col>
+
+        <!-- 结算金额 -->
+        <el-col :span="24">
+          <el-card class="box-card">
+            <div slot="header">
+              <span>结算金额</span>
+              <el-tooltip content="结算金额 = 支付宝/微信 - 收取押金 - 收取福利押金 - 收取卡密押金 - 收取材料费 - 系统维护费 - 洗衣费 - 顺丰快递费 - 跨店结算金 - 超额订货金额" placement="top">
+                <i class="el-icon-question"></i>
+              </el-tooltip>
+            </div>
+            <el-form ref="settlementForm" :model="form" label-width="120px">
+              <el-form-item label="实际结算金额" prop="realSettlementAmount">
+                <el-input-number v-model="form.realSettlementAmount" :disabled="true" :precision="2" :controls="false" style="width: 180px"></el-input-number>
+              </el-form-item>
+              <el-form-item label="清算备注" prop="settleRemark">
+                <el-input type="textarea" v-model="form.settleRemark" :rows="3" :disabled="getCanEdit" style="width: 100%"></el-input>
+              </el-form-item>
+            </el-form>
+          </el-card>
+        </el-col>
+      </el-row>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm" v-if="!getCanEdit">确认结算</el-button>
+        <el-button @click="cancel">关 闭</el-button>
+      </div>
+    </el-dialog>
     </div>
 </template>
 
 <script>
 import { getRate, delRate } from '@/api/settlement/rate'
 import { allOrg } from '@/api/system/store'
-import { insertSettlementBill, listFactorySettlement, listSettlementBill, confirmSettlementByFactory, listStoreSettlement, getInfoByStore, submitStoreSettlement } from '@/api/settlement/bill'
+import { listStoreSettlement, getInfoByStore, submitStoreSettlement } from '@/api/settlement/bill'
 
 export default {
-    name: 'billSettlementStore',
+    name: 'BillSettlementStore',
     dicts: ['settlement_status_type'],
     data() {
         return {
@@ -232,7 +251,29 @@ export default {
             form: {},
             // 表单校验
             rules: {
-                title: [{ required: true, message: '账单标题不能为空', trigger: 'blur' }]
+        settlePaidDeposit: [
+          { required: true, message: '请输入收取余额押金', trigger: 'blur' },
+          { type: 'number', message: '收取余额押金必须为数字', trigger: 'blur' }
+        ],
+        settleWelfareDeposit: [
+          { required: true, message: '请输入收取福利押金', trigger: 'blur' },
+          { type: 'number', message: '收取福利押金必须为数字', trigger: 'blur' }
+        ],
+        settleGetCardPasswordDeposit: [
+          { required: true, message: '请输入收取卡密押金', trigger: 'blur' },
+          { type: 'number', message: '收取卡密押金必须为数字', trigger: 'blur' }
+        ],
+        settleMaterialImprestAmount: [
+          { required: true, message: '请输入收取材料费', trigger: 'blur' },
+          { type: 'number', message: '收取材料费必须为数字', trigger: 'blur' }
+        ],
+        realSettlementAmount: [
+          { required: true, message: '请输入实际结算金额', trigger: 'blur' },
+          { type: 'number', message: '实际结算金额必须为数字', trigger: 'blur' }
+        ],
+        settleRemark: [
+          { required: true, message: '请输入清算备注', trigger: 'blur' }
+        ]
             },
             orgList: [],
             storeList: [],
@@ -287,96 +328,10 @@ export default {
             })
         },
         handleSettleAmount(id) {
-            if (this.settlementManageStore.status == '1') {
-                this.form.settleRemark = this.settlementManageStore.settleRemark
-                //清算收取卡密押金
-                this.form.settleGetCardPasswordDeposit = this.settlementManageStore.settleGetCardPasswordDeposit
-                //清算福利金额
-                this.form.settleWelfareDeposit = this.settlementManageStore.settleWelfareDeposit
-                //清算已付押金
-                this.form.settlePaidDeposit = this.settlementManageStore.settlePaidDeposit
-                //清算原材料备用金(材料费)
-                this.form.settleMaterialImprestAmount = this.settlementManageStore.settleMaterialImprestAmount
-                this.form.realSettlementAmount = this.settlementManageStore.settleSettlementAmount
-                return
-            }
-            //门店结算Id
-            this.form.settleId = id
-            this.form.settleRemark = this.settlementManageStore.settleRemark
-            //清算收取卡密押金
-            this.form.settleGetCardPasswordDeposit = this.settlementManageStore.cardPasswordDeposit - this.settlementManageStore.paidCardPasswordDeposit
-            //清算福利金额
-            this.form.settleWelfareDeposit = this.settlementManageStore.welfareDeposit - this.settlementManageStore.paidWelfareDeposit
-            //清算已付押金
-            this.form.settlePaidDeposit = this.settlementManageStore.payableDeposit - this.settlementManageStore.paidDeposit
-            //清算原材料备用金(材料费)
-            this.form.settleMaterialImprestAmount = this.settlementManageStore.materialImprestAmount
-
-            //实际结算金额
-            // (结算金额=支付宝/微信-(应付押金-已付押金)-(应付福利押金+卡密押金-已付福利押金-已付卡密押金)-原材料备用金-系统维护费-洗衣费-顺丰快递费-跨店结算金-超额订货金额)
-            if (this.settlementManageStore.alipayAndWechatAmount == null) {
-                this.form.realSettlementAmount =
-                    (this.settlementManageStore.alipayAmount * 1000000 +
-                        this.settlementManageStore.wechatAmount * 1000000 -
-                        (this.settlementManageStore.cardPasswordDeposit * 1000000 - this.settlementManageStore.paidCardPasswordDeposit * 1000000) -
-                        (this.settlementManageStore.welfareDeposit * 1000000 - this.settlementManageStore.paidWelfareDeposit * 1000000) -
-                        (this.settlementManageStore.payableDeposit * 1000000 - this.settlementManageStore.paidDeposit * 1000000) -
-                        this.settlementManageStore.materialImprestAmount * 1000000 -
-                        this.settlementManageStore.systemMaintenanceAmount * 1000000 -
-                        this.settlementManageStore.washClothAmount * 1000000 -
-                        this.settlementManageStore.sfExpressAmount * 1000000 -
-                        this.settlementManageStore.crossStoreSettlementAmount * 1000000 -
-                        this.settlementManageStore.overOrderingAmount * 1000000) /
-                    1000000
-            } else {
-                this.form.realSettlementAmount =
-                    (this.settlementManageStore.alipayAndWechatAmount * 1000000 -
-                        (this.settlementManageStore.cardPasswordDeposit * 1000000 - this.settlementManageStore.paidCardPasswordDeposit * 1000000) -
-                        (this.settlementManageStore.welfareDeposit * 1000000 - this.settlementManageStore.paidWelfareDeposit * 1000000) -
-                        (this.settlementManageStore.payableDeposit * 1000000 - this.settlementManageStore.paidDeposit * 1000000) -
-                        this.settlementManageStore.materialImprestAmount * 1000000 -
-                        this.settlementManageStore.systemMaintenanceAmount * 1000000 -
-                        this.settlementManageStore.washClothAmount * 1000000 -
-                        this.settlementManageStore.sfExpressAmount * 1000000 -
-                        this.settlementManageStore.crossStoreSettlementAmount * 1000000 -
-                        this.settlementManageStore.overOrderingAmount * 1000000) /
-                    1000000
-            }
-            //清算结算金额, 暂时没有用
-            this.form.settleSettlementAmount = this.settlementManageStore.settlementAmount
+            this.initSettlementForm()
         },
         restartCountSettlementAmount() {
-            if (this.settlementManageStore.alipayAndWechatAmount == null) {
-                this.form.realSettlementAmount =
-                    (this.settlementManageStore.alipayAmount * 1000000 +
-                        this.settlementManageStore.wechatAmount * 1000000 -
-                        this.form.settleGetCardPasswordDeposit * 1000000 -
-                        this.form.settleWelfareDeposit * 1000000 -
-                        this.form.settlePaidDeposit * 1000000 -
-                        this.form.settleMaterialImprestAmount * 1000000 -
-                        this.settlementManageStore.systemMaintenanceAmount * 1000000 -
-                        this.settlementManageStore.washClothAmount * 1000000 -
-                        this.settlementManageStore.sfExpressAmount * 1000000 -
-                        this.settlementManageStore.crossStoreSettlementAmount * 1000000 -
-                        this.settlementManageStore.overOrderingAmount * 1000000) /
-                    1000000
-            } else {
-                this.form.realSettlementAmount =
-                    (this.settlementManageStore.alipayAndWechatAmount * 1000000 -
-                        this.form.settleGetCardPasswordDeposit * 1000000 -
-                        this.form.settleWelfareDeposit * 1000000 -
-                        this.form.settlePaidDeposit * 1000000 -
-                        this.form.settleMaterialImprestAmount * 1000000 -
-                        this.settlementManageStore.systemMaintenanceAmount * 1000000 -
-                        this.settlementManageStore.washClothAmount * 1000000 -
-                        this.settlementManageStore.sfExpressAmount * 1000000 -
-                        this.settlementManageStore.crossStoreSettlementAmount * 1000000 -
-                        this.settlementManageStore.overOrderingAmount * 1000000) /
-                    1000000
-            }
-            //清算结算金额, 暂时没有用
-            this.form.settleSettlementAmount = this.form.realSettlementAmount
-            this.$forceUpdate()
+            this.calculateSettlementAmount()
         },
         /** 查询结算费率列表 */
         getList() {
@@ -456,7 +411,7 @@ export default {
                         }
                     })
                 })
-                .catch(() => {})
+        .catch(() => { })
         },
         /** 删除按钮操作 */
         handleDelete(row) {
@@ -470,7 +425,7 @@ export default {
                     this.getList()
                     this.$modal.msgSuccess('删除成功')
                 })
-                .catch(() => {})
+        .catch(() => { })
         },
         /** 导出按钮操作 */
         handleExport() {
@@ -487,9 +442,105 @@ export default {
                 .then(function () {
                     done()
                 })
-                .then(() => {})
-                .catch(() => {})
+        .then(() => { })
+        .catch(() => { })
+        },
+        /**
+         * 处理金额变化,重新计算结算金额
+         */
+        handleAmountChange() {
+            this.calculateSettlementAmount()
+        },
+
+        /**
+         * 计算实际结算金额
+         */
+        calculateSettlementAmount() {
+            const baseAmount = this.settlementManageStore.alipayAndWechatAmount || 
+                (this.settlementManageStore.alipayAmount + this.settlementManageStore.wechatAmount)
+            
+            const result = baseAmount * 1000000 -
+                this.form.settlePaidDeposit * 1000000 -
+                this.form.settleWelfareDeposit * 1000000 -
+                this.form.settleGetCardPasswordDeposit * 1000000 -
+                this.form.settleMaterialImprestAmount * 1000000 -
+                this.settlementManageStore.systemMaintenanceAmount * 1000000 -
+                this.settlementManageStore.washClothAmount * 1000000 -
+                this.settlementManageStore.sfExpressAmount * 1000000 -
+                this.settlementManageStore.crossStoreSettlementAmount * 1000000 -
+                this.settlementManageStore.overOrderingAmount * 1000000
+
+            this.form.realSettlementAmount = Number((result / 1000000).toFixed(2))
+        },
+
+        /**
+         * 初始化结算表单数据
+         */
+        initSettlementForm() {
+            if (this.settlementManageStore.status === '1') {
+                // 已结算状态,展示历史数据
+                this.form = {
+                    settleRemark: this.settlementManageStore.settleRemark,
+                    settleGetCardPasswordDeposit: this.settlementManageStore.settleGetCardPasswordDeposit,
+                    settleWelfareDeposit: this.settlementManageStore.settleWelfareDeposit,
+                    settlePaidDeposit: this.settlementManageStore.settlePaidDeposit,
+                    settleMaterialImprestAmount: this.settlementManageStore.settleMaterialImprestAmount,
+                    realSettlementAmount: this.settlementManageStore.settleSettlementAmount
+                }
+            } else {
+                // 未结算状态,计算初始值
+                this.form = {
+                    settleId: this.settlementManageStore.id,
+                    settleGetCardPasswordDeposit: this.settlementManageStore.cardPasswordDeposit - this.settlementManageStore.paidCardPasswordDeposit,
+                    settleWelfareDeposit: this.settlementManageStore.welfareDeposit - this.settlementManageStore.paidWelfareDeposit,
+                    settlePaidDeposit: this.settlementManageStore.payableDeposit - this.settlementManageStore.paidDeposit,
+                    settleMaterialImprestAmount: this.settlementManageStore.materialImprestAmount,
+                    settleRemark: ''
+                }
+                this.calculateSettlementAmount()
+            }
         }
     }
 }
 </script>
+
+<style lang="scss" scoped>
+.box-card {
+  margin-bottom: 20px;
+  
+  .el-card__header {
+    padding: 10px 20px;
+    font-weight: bold;
+    
+    .el-icon-question {
+      margin-left: 5px;
+      color: #909399;
+      cursor: help;
+    }
+  }
+}
+
+.el-statistic {
+  text-align: center;
+  
+  .el-statistic__title {
+    font-size: 14px;
+    color: #606266;
+  }
+  
+  .el-statistic__content {
+    color: #409EFF;
+    font-size: 20px;
+    font-weight: bold;
+  }
+}
+
+.el-input-number {
+  width: 180px !important;
+}
+
+.dialog-footer {
+  text-align: center;
+  margin-top: 20px;
+}
+</style>

+ 6 - 4
yiqi-admin/src/main/java/com/yiqi/admin/controller/core/SettlementManageBillController.java

@@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.yiqi.common.core.page.TableDataInfo;
 import com.yiqi.common.exception.ServiceException;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yiqi.common.constant.UrlConstants;
@@ -82,9 +83,10 @@ public class SettlementManageBillController extends BaseController {
      * 查询结算账单列表
      */
     @PreAuthorize("@ss.hasPermi('settlement:bill:list')")
-    @PostMapping("/listSettlementBill")
+    @GetMapping("/listSettlementBill")
     @ApiOperation(value = "查询结算账单列表")
-    public R<Page<SettlementManageBill>> listSettlementBill(@RequestBody SettlementBillListQueryDTO settlementBillListQueryDTO) {
+    public TableDataInfo listSettlementBill(SettlementBillListQueryDTO settlementBillListQueryDTO) {
+        startPage();
         LambdaQueryWrapper<SettlementManageBill> queryWrapper = new QueryWrapper<SettlementManageBill>().lambda()
                 .eq(SettlementManageBill::getDelFlag, StatusType.OK.getCode());
         if (StrUtil.isNotEmpty(settlementBillListQueryDTO.getMonthTime())){
@@ -94,8 +96,8 @@ public class SettlementManageBillController extends BaseController {
             queryWrapper.like(SettlementManageBill::getTitle, settlementBillListQueryDTO.getTitle());
         }
         queryWrapper.orderByDesc(BaseEntity::getCreateTime);
-        return R.ok(settlementManageBillService.page(new Page<>(
-                settlementBillListQueryDTO.getPageNum(), settlementBillListQueryDTO.getPageSize()), queryWrapper));
+        List<SettlementManageBill> list = settlementManageBillService.list(queryWrapper);
+        return getDataTable(list);
     }
 
     /**

+ 16 - 0
yiqi-admin/src/main/java/com/yiqi/admin/controller/settlement/SettlementStoreStatisticsController.java

@@ -87,6 +87,22 @@ public class SettlementStoreStatisticsController extends BaseController {
 
         List<SettlementStoreStatistics> list = settlementStoreStatisticsService
                 .generateStoreStatisticsByDate(storeId, start, end);
+        return getDataTable(list);
+    }
+
+    /**
+     * 获取门店每日交易统计列表
+     */
+    @GetMapping("/list/bystore")
+    public TableDataInfo listByStore(@RequestParam(required = false) String startDate,
+                              @RequestParam(defaultValue = "1") Integer pageNum,
+                              @RequestParam(defaultValue = "15") Integer pageSize) {
+
+        startPage();
+        Date start = startDate != null ? DateUtils.parseDate(startDate) : DateUtils.addDays(new Date(), -1);
+
+        List<SettlementStoreStatistics> list = settlementStoreStatisticsService
+                .generateStoreStatisticsByStore(start);
 
         return getDataTable(list);
     }

+ 14 - 5
yiqi-admin/src/main/java/com/yiqi/task/SettlementTask.java

@@ -7,6 +7,8 @@ import com.yiqi.core.service.ISettlementManageBillService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
 import java.util.Date;
 
 /**
@@ -21,13 +23,20 @@ public class SettlementTask {
     private ISettlementManageBillService settlementManageBillService;
 
     public void insertSettlementBill(String date) {
-        if (StringUtils.isEmpty(date)) {
-            date = DateUtils.parseDateToStr(DateUtils.YYYY_MM, DateUtils.addMonths(DateUtils.getNowDate(), -1));
-        }
-        String title = date + "账单";
+// 获取上个月的时间范围
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(Calendar.MONTH, -1);
+
+        SimpleDateFormat monthFormat = new SimpleDateFormat("yyyy-MM");
+        String month = monthFormat.format(calendar.getTime());
+
+        // 构建结算标题
+        String title = month + "月份结算";
+
+        // 创建结算单
         SettlementBillAddDTO settlementBillAddDTO = new SettlementBillAddDTO();
-        settlementBillAddDTO.setMonth(date);
         settlementBillAddDTO.setTitle(title);
+        settlementBillAddDTO.setMonth(month);
         settlementManageBillService.insertSettlementManageBill(settlementBillAddDTO);
     }
 }

+ 8 - 1
yiqi-common/src/main/java/com/yiqi/app/domain/AppUserBillMstr.java

@@ -132,5 +132,12 @@ public class AppUserBillMstr extends BaseEntity
     @ApiModelProperty("是否为退款")
     private String isRefund;
 
-
+    /**
+     * 根据会员余额所消费的门店费率计算分成,分成规则为:
+     *      * 本店卡洗衣所得为本店卡在异店消费分给消费门店的费用,异店卡洗衣为异店卡在本店消费分给本店的费用*
+     */
+    /** 会员卡归属门店 */
+    @Excel(name = "会员卡归属门店")
+    @ApiModelProperty("会员卡归属门店")
+    private Long cardStoreId;
 }

+ 0 - 4
yiqi-common/src/main/java/com/yiqi/app/service/IAppUserBillMstrService.java

@@ -86,8 +86,4 @@ public interface IAppUserBillMstrService extends IService<AppUserBillMstr> {
     public int deleteAppUserBillMstrById(Long id);
 
 
-
-    //</editor-folder>
-
-
 }

+ 1 - 1
yiqi-common/src/main/java/com/yiqi/common/enums/OrderSourceType.java

@@ -7,7 +7,7 @@ public enum OrderSourceType {
     APP("APP", "APP"),
     WXAPP("WXAPP", "微信小程序"),
     OFFLINE("OFFLINE", "线下门店"),
-    HQ("HQ", "总部直充导入"),
+    HQ("HQ", "总部导入"),
     ;
 
     private final String code;

+ 10 - 2
yiqi-common/src/main/java/com/yiqi/core/domain/SettlementStoreStatistics.java

@@ -3,6 +3,7 @@ package com.yiqi.core.domain;
 import java.math.BigDecimal;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.yiqi.common.annotation.Excel;
@@ -41,6 +42,13 @@ public class SettlementStoreStatistics extends BaseEntity {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long storeId;
 
+    /**
+     * 门店名称
+     */
+    @Excel(name = "门店名称")
+    @TableField(exist = false)
+    private String storeName;
+
     /**
      * 结算日期
      */
@@ -121,8 +129,8 @@ public class SettlementStoreStatistics extends BaseEntity {
     /**
      * 福利支付金额
      */
-    @Excel(name = "福利支付金额")
-    @ApiModelProperty("福利支付金额")
+    @Excel(name = "会员支付金额")
+    @ApiModelProperty("会员支付金额")
     private BigDecimal clothMemberAmount;
 
     /**

+ 6 - 2
yiqi-common/src/main/java/com/yiqi/core/service/ISettlementStoreStatisticsService.java

@@ -101,6 +101,10 @@ public interface ISettlementStoreStatisticsService extends IService<SettlementSt
      */
     public int deleteSettlementStoreStatisticsById(Long id);
 
-
-
+    /**
+     * 生成门店每日统计数据*
+     * @param date
+     * @return
+     */
+    List<SettlementStoreStatistics> generateStoreStatisticsByStore(Date start);
 }

+ 1 - 1
yiqi-common/src/main/java/com/yiqi/recharge/domain/dto/BillMstrOrderDTO.java

@@ -81,7 +81,7 @@ public class BillMstrOrderDTO {
     private Long storeId;
 
     /**
-     * 用户绑定门店
+     * 会员卡绑定门店
      */
     private Long useBindStoreId;
 

+ 9 - 1
yiqi-common/src/main/java/com/yiqi/recharge/domain/dto/ConsumeOrderDTO.java

@@ -54,9 +54,16 @@ public class ConsumeOrderDTO {
      */
     private Long appUserId;
 
-
+    /**
+     * 消费门店*
+     */
     private Long storeId;
 
+    /**
+     * 会员卡绑定门店
+     */
+    private Long useBindStoreId;
+
     /**
      * 订单来源
      */
@@ -100,6 +107,7 @@ public class ConsumeOrderDTO {
         consumeOrderDTO.setOrderId(orderRecharge.getId());
         consumeOrderDTO.setOrderNo(orderRecharge.getOrderNo());
         consumeOrderDTO.setOrderType(OrderType.recharge.getCode());
+        consumeOrderDTO.setUseBindStoreId(orderRecharge.getStoreId());
         consumeOrderDTO.setPointAmount(orderRecharge.getGivePointAmount());
         consumeOrderDTO.setStoreId(SecurityUtils.getLoginUser().getStoreId());
         consumeOrderDTO.setIsRefund(SysBoolType.NO.getCode());

+ 0 - 9
yiqi-common/src/main/java/com/yiqi/recharge/service/IRechargePasswordCardService.java

@@ -119,15 +119,6 @@ public interface IRechargePasswordCardService extends IService<RechargePasswordC
     DirectChargingImportVO importDirectCharging(DirectChargingImportRequest request);
 
 
-    /**
-     * 消费日志
-     * @param consumeOrderDTO
-     * @param rechargePasswordCard
-     * @return
-     */
-    public AppUserBillMstr buildBillMstr(ConsumeOrderDTO consumeOrderDTO, RechargePasswordCard rechargePasswordCard
-            , BigDecimal rechargeAmount, BigDecimal giveAmount, BigDecimal welfareAmount);
-
     /**
      * 按客户获取充值卡信息
      */

+ 9 - 3
yiqi-common/src/main/java/com/yiqi/system/domain/SysStore.java

@@ -203,7 +203,13 @@ public class SysStore extends BaseEntity{
     private String wxStoreId;
 
     /** 余额 */
-    @Excel(name = "余额")
-    @ApiModelProperty("余额")
-    private BigDecimal balance;
+    @Excel(name = "材料备用金余额")
+    @ApiModelProperty("材料备用金余额")
+    private BigDecimal materialBalance;
+
+
+    /** 免洗余额 */
+    @Excel(name = "免洗余额")
+    @ApiModelProperty("免洗余额")
+    private BigDecimal noWashBalance;
 }

+ 3 - 4
yiqi-core/src/main/java/com/yiqi/app/service/impl/AppUserBillMstrServiceImpl.java

@@ -55,7 +55,6 @@ public class AppUserBillMstrServiceImpl extends ServiceImpl<AppUserBillMstrMappe
         appUserBillMstr.setAppUserId(billMstrOrderDTO.getAppUserId());
         appUserBillMstr.setBillType(OrderBillType.pay.getCode());
         appUserBillMstr.setPayTotalAmount(billMstrOrderDTO.getPayTotalAmount());
-        appUserBillMstr.setCashPayAmount(BigDecimal.ZERO);
         appUserBillMstr.setPayType(billMstrOrderDTO.getPayType());
         appUserBillMstr.setRechargePayAmount(billMstrOrderDTO.getRechargePayAmount());
         appUserBillMstr.setGivePayAmount(billMstrOrderDTO.getGivePayAmount());
@@ -64,6 +63,7 @@ public class AppUserBillMstrServiceImpl extends ServiceImpl<AppUserBillMstrMappe
         appUserBillMstr.setOrderNo(billMstrOrderDTO.getOrderNo());
         appUserBillMstr.setOrderType(billMstrOrderDTO.getOrderType());
         appUserBillMstr.setOrgId(billMstrOrderDTO.getStoreId());
+        appUserBillMstr.setCardStoreId(billMstrOrderDTO.getUseBindStoreId());
         appUserBillMstr.setSourceType(SourceType.STORE.getCode());
         appUserBillMstr.setContent(billMstrOrderDTO.getRemark());
         appUserBillMstr.setRechargeCardNo(billMstrOrderDTO.getRechargeCardNo());
@@ -104,7 +104,6 @@ public class AppUserBillMstrServiceImpl extends ServiceImpl<AppUserBillMstrMappe
         appUserBillMstr.setAppUserId(billMstrOrderDTO.getAppUserId());
         appUserBillMstr.setBillType(OrderBillType.recharge.getCode());
         appUserBillMstr.setPayTotalAmount(billMstrOrderDTO.getPayTotalAmount().negate());
-        appUserBillMstr.setCashPayAmount(BigDecimal.ZERO);
         appUserBillMstr.setRechargePayAmount(billMstrOrderDTO.getRechargePayAmount().negate());
         appUserBillMstr.setGivePayAmount(billMstrOrderDTO.getGivePayAmount().negate());
         appUserBillMstr.setPayType(billMstrOrderDTO.getPayType());
@@ -114,6 +113,7 @@ public class AppUserBillMstrServiceImpl extends ServiceImpl<AppUserBillMstrMappe
         appUserBillMstr.setOrderNo(billMstrOrderDTO.getOrderNo());
         appUserBillMstr.setOrderType(billMstrOrderDTO.getOrderType());
         appUserBillMstr.setOrgId(billMstrOrderDTO.getStoreId());
+        appUserBillMstr.setCardStoreId(billMstrOrderDTO.getUseBindStoreId());
         appUserBillMstr.setSourceType(SourceType.STORE.getCode());
         appUserBillMstr.setContent(billMstrOrderDTO.getRemark());
         switch (EnumUtils.getEnumByType(billMstrOrderDTO.getOrderType(), OrderType.class)) {
@@ -154,8 +154,6 @@ public class AppUserBillMstrServiceImpl extends ServiceImpl<AppUserBillMstrMappe
         appUserBillMstr.setAppUserId(consumeOrderDTO.getAppUserId());
         appUserBillMstr.setBillType(OrderBillType.pay.getCode());
         appUserBillMstr.setPayTotalAmount(consumeOrderDTO.getAmount().multiply(new BigDecimal(-1)));
-        appUserBillMstr.setCashPayAmount(PayType.CASH.getCode().equals(consumeOrderDTO.getPayType())
-                ? consumeOrderDTO.getAmount().multiply(new BigDecimal(-1)) : BigDecimal.ZERO);
         appUserBillMstr.setRechargePayAmount(BigDecimal.ZERO);
         appUserBillMstr.setGivePayAmount(BigDecimal.ZERO);
         appUserBillMstr.setWelfarePayAmount(BigDecimal.ZERO);
@@ -198,6 +196,7 @@ public class AppUserBillMstrServiceImpl extends ServiceImpl<AppUserBillMstrMappe
         appUserBillMstr.setOrderNo(consumeOrderDTO.getOrderNo());
         appUserBillMstr.setOrderType(consumeOrderDTO.getOrderType());
         appUserBillMstr.setOrgId(consumeOrderDTO.getStoreId());
+        appUserBillMstr.setCardStoreId(consumeOrderDTO.getUseBindStoreId());
         appUserBillMstr.setPayType(consumeOrderDTO.getPayType());
         return appUserBillMstr;
     }

+ 45 - 7
yiqi-core/src/main/java/com/yiqi/core/service/impl/SettlementManageBillServiceImpl.java

@@ -7,6 +7,7 @@ import java.util.concurrent.CompletableFuture;
 
 import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.wechat.pay.java.service.billdownload.model.BillType;
 import com.yiqi.app.domain.AppUserBillMstr;
 import com.yiqi.app.service.IAppUserBillMstrService;
 import com.yiqi.common.enums.*;
@@ -399,8 +400,6 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
         for (SysStore store : storeList) {
             this.buildStoreSettlement(settlementManageBill, store);
         }
-        // 计算门店结算明细
-//        threadPoolTaskExecutor.execute(() -> this.buildStoreSettlement(settlementManageBill, storeList));
     }
 
 
@@ -464,6 +463,7 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
                 CompletableFuture.runAsync(() -> {
                     data.setCrossStoreBills(appUserBillMstrService.list(new QueryWrapper<AppUserBillMstr>()
                             .eq("org_id", storeId)
+                            .or().eq("card_store_id", storeId)
                             .between("create_time", startTime, endTime)));
                 }),
 
@@ -614,15 +614,53 @@ public class SettlementManageBillServiceImpl extends ServiceImpl<SettlementManag
         BigDecimal systemMaintenanceAmount = CurrencyUtil.mul(settlement.getOrderAmount(), data.getSettlementRate().getManagementRate());
         settlement.setSystemMaintenanceAmount(systemMaintenanceAmount);
 
-        // 3. 计算洗衣费
-//        BigDecimal washAmount = calculateWashAmount(data);
-//        settlement.setWashClothAmount(washAmount);
-//
-//        // 4. 计算跨店结算金额
+        // 3. 计算洗衣费 (已入厂)
+        BigDecimal washAmount = data.getClothItems().stream()
+                .filter(item -> Integer.parseInt(item.getFlowStatus()) > 0)
+                .map(OrderClothItem::getPayPrice)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        settlement.setWashClothAmount(washAmount);
+
+
+        calculateCrossStoreAmount(data);
+
+
 //        BigDecimal crossStoreAmount = calculateCrossStoreAmount(data);
 //        settlement.setCrossStoreSettlementAmount(crossStoreAmount);
     }
 
+    /**
+     * 计算跨店结算金额
+     */
+    private void calculateCrossStoreAmount(SettlementManageStore settlement, StoreSettlementData data) {
+        // 4. 计算跨店结算金额(会员卡)
+        // 跨店结算金=(本店卡:洗衣*费率-异店卡:洗衣*费率)+
+        // (本店卡:零售*费率-异店卡:零售*费率)+(本店卡:app*费率-异店卡:app*费率)+
+        // (本店卡:第三方*费率-异店卡:第三方*费率)+(本店卡:运费*费率-异店卡:运费*费率)
+        //消费的订单金额  洗衣 零售 app 第三方 运费
+        Map<String, BigDecimal> consoumeMaps = data.getCrossStoreBills().stream()
+                .filter(order -> OrderBillType.pay.getCode().equals(order.getBillType()))
+                .collect(Collectors.groupingBy(
+                        AppUserBillMstr::getOrderType,
+                        Collectors.reducing(
+                                BigDecimal.ZERO,
+                                AppUserBillMstr::getPayTotalAmount,
+                                BigDecimal::add
+                        )));
+        //退款的订单金额
+        Map<String, BigDecimal> refundMaps = data.getCrossStoreBills().stream()
+                .filter(order -> OrderBillType.recharge.getCode().equals(order.getBillType()))
+                .collect(Collectors.groupingBy(
+                        AppUserBillMstr::getOrderType,
+                        Collectors.reducing(
+                                BigDecimal.ZERO,
+                                AppUserBillMstr::getPayTotalAmount,
+                                BigDecimal::add
+                        )));
+
+
+    }
+
     /**
      * 计算最终结算金额
      */

+ 40 - 0
yiqi-core/src/main/java/com/yiqi/core/service/impl/SettlementManageFactoryServiceImpl.java

@@ -8,6 +8,7 @@ import com.yiqi.core.mapper.SettlementManageFactoryMapper;
 import com.yiqi.core.domain.SettlementManageFactory;
 import com.yiqi.core.service.ISettlementManageFactoryService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 工厂结算详情Service业务层处理
@@ -17,4 +18,43 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  */
 @Service
 public class SettlementManageFactoryServiceImpl extends ServiceImpl<SettlementManageFactoryMapper,SettlementManageFactory> implements ISettlementManageFactoryService {
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void modifyFactorySettlement(SettlementManageFactory settlement) {
+        // 1. 检查结算状态
+        SettlementManageFactory original = getById(settlement.getId());
+        if (!"0".equals(original.getStatus())) {
+            throw new RuntimeException("只能修改待确认的工厂结算");
+        }
+        
+        // 2. 更新结算数据
+        updateById(settlement);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void confirmBatchFactorySettlement(List<Long> ids) {
+        // 批量更新状态为已确认
+        lambdaUpdate()
+            .set(SettlementManageFactory::getStatus, "1")
+            .in(SettlementManageFactory::getId, ids)
+            .update();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void reverseFactorySettlement(Long id) {
+        // 1. 检查结算状态
+        SettlementManageFactory factory = getById(id);
+        if (!"1".equals(factory.getStatus())) {
+            throw new RuntimeException("只能红冲已确认的工厂结算");
+        }
+        
+        // 2. 更新状态为已红冲
+        lambdaUpdate()
+            .set(SettlementManageFactory::getStatus, "2")
+            .eq(SettlementManageFactory::getId, id)
+            .update();
+    }
 }

+ 42 - 2
yiqi-core/src/main/java/com/yiqi/core/service/impl/SettlementManageStoreServiceImpl.java

@@ -8,13 +8,53 @@ import com.yiqi.core.mapper.SettlementManageStoreMapper;
 import com.yiqi.core.domain.SettlementManageStore;
 import com.yiqi.core.service.ISettlementManageStoreService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
- * 门店结算详情Service业务层处理
+ * 门店结算服务实现
  *
  * @author ruoyi
  * @date 2024-02-15
  */
 @Service
-public class SettlementManageStoreServiceImpl extends ServiceImpl<SettlementManageStoreMapper,SettlementManageStore> implements ISettlementManageStoreService {
+public class SettlementManageStoreServiceImpl extends ServiceImpl<SettlementManageStoreMapper, SettlementManageStore> implements ISettlementManageStoreService {
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void modifyStoreSettlement(SettlementManageStore settlement) {
+        // 1. 检查结算状态
+        SettlementManageStore original = getById(settlement.getId());
+        if (!"0".equals(original.getStatus())) {
+            throw new RuntimeException("只能修改待确认的门店结算");
+        }
+        
+        // 2. 更新结算数据
+        updateById(settlement);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void confirmBatchStoreSettlement(List<Long> ids) {
+        // 批量更新状态为已确认
+        lambdaUpdate()
+            .set(SettlementManageStore::getStatus, "1")
+            .in(SettlementManageStore::getId, ids)
+            .update();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void reverseStoreSettlement(Long id) {
+        // 1. 检查结算状态
+        SettlementManageStore store = getById(id);
+        if (!"1".equals(store.getStatus())) {
+            throw new RuntimeException("只能红冲已确认的门店结算");
+        }
+        
+        // 2. 更新状态为已红冲
+        lambdaUpdate()
+            .set(SettlementManageStore::getStatus, "2")
+            .eq(SettlementManageStore::getId, id)
+            .update();
+    }
 }

+ 11 - 0
yiqi-core/src/main/java/com/yiqi/core/service/impl/SettlementStoreStatisticsServiceImpl.java

@@ -75,6 +75,17 @@ public class SettlementStoreStatisticsServiceImpl extends ServiceImpl<Settlement
         return result;
     }
 
+    @Override
+    public List<SettlementStoreStatistics> generateStoreStatisticsByStore(Date start) {
+        Integer startDay = Integer.parseInt(DateUtil.format(start, "yyyyMMdd"));
+        List<SettlementStoreStatistics> result = baseMapper.selectList(new QueryWrapper<SettlementStoreStatistics>().lambda()
+                .eq(SettlementStoreStatistics::getDay, startDay));
+        for (SettlementStoreStatistics settlementStoreStatistics : result){
+            settlementStoreStatistics.setStoreName(storeService.getById(settlementStoreStatistics.getStoreId()).getName());
+        }
+        return result;
+    }
+
     @Override
     public void generateDayStatistics(Date date) {
         // 1. 获取所有有效门店

+ 2 - 2
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderActivityServiceImpl.java

@@ -171,7 +171,7 @@ public class OrderActivityServiceImpl extends ServiceImpl<OrderActivityMapper, O
         // 添加订单优惠券给客户
         this.addCoupon4AppUser(orderActivity);
         // 记录账单
-        appUserBillMstrService.consumeRecord(ConsumeOrderDTO.buildOrderActivityData(orderActivity));
+//        appUserBillMstrService.consumeRecord(ConsumeOrderDTO.buildOrderActivityData(orderActivity));
         return R.ok();
     }
 
@@ -274,7 +274,7 @@ public class OrderActivityServiceImpl extends ServiceImpl<OrderActivityMapper, O
         //返回优惠券库存
         this.handleAddCouponStock(orderActivity);
         //此处添加退款记录
-        appUserBillMstrService.save(appUserBillMstrService.buildBillMstr(ConsumeOrderDTO.buildOrderActivityRefundData(orderActivity)));
+//        appUserBillMstrService.save(appUserBillMstrService.buildBillMstr(ConsumeOrderDTO.buildOrderActivityRefundData(orderActivity)));
         return R.ok();
     }
 

+ 2 - 3
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderPurchaseGoodsServiceImpl.java

@@ -11,7 +11,6 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.yiqi.common.exception.ServiceException;
-import com.yiqi.app.domain.vo.AppUserInfoVO;
 import com.yiqi.common.core.domain.entity.SysUser;
 import com.yiqi.common.enums.*;
 import com.yiqi.common.exception.GlobalException;
@@ -631,7 +630,7 @@ public class OrderPurchaseGoodsServiceImpl extends ServiceImpl<OrderPurchaseGood
             if (store == null) {
                 throw new ServiceException("该门店不存在,无法进货");
             }
-            balance = store.getBalance() == null ? BigDecimal.ZERO : store.getBalance();
+            balance = store.getMaterialBalance() == null ? BigDecimal.ZERO : store.getMaterialBalance();
         }
         BigDecimal lastBalance = BigDecimal.ZERO;
         if (BigDecimal.ZERO.equals(balance)) {
@@ -656,7 +655,7 @@ public class OrderPurchaseGoodsServiceImpl extends ServiceImpl<OrderPurchaseGood
         if (SourceType.STORE.getCode().equals(SecurityUtils.getLoginUser().getSourceType())) {
             sysStoreService.update(new UpdateWrapper<SysStore>().lambda()
                     .eq(SysStore::getId, SecurityUtils.getLoginUser().getUser().getStoreId())
-                    .set(SysStore::getBalance, lastBalance));
+                    .set(SysStore::getMaterialBalance, lastBalance));
         }
 
     }

+ 1 - 84
yiqi-core/src/main/java/com/yiqi/recharge/service/impl/RechargePasswordCardServiceImpl.java

@@ -81,90 +81,6 @@ public class RechargePasswordCardServiceImpl extends ServiceImpl<RechargePasswor
     @Autowired
     private IAppUserBillMstrService billMstrOrderService;
 
-    /**
-     * 消费日志
-     *
-     * @param consumeOrderDTO      消费信息
-     * @param rechargePasswordCard 充值卡
-     * @param rechargeAmount       充值余额支付金额
-     * @param giveAmount           赠送余额支付金额
-     * @param welfareAmount        福利金余额支付金额
-     * @return
-     */
-    @Override
-    public AppUserBillMstr buildBillMstr(ConsumeOrderDTO consumeOrderDTO, RechargePasswordCard rechargePasswordCard
-            , BigDecimal rechargeAmount, BigDecimal giveAmount, BigDecimal welfareAmount) {
-        AppUserBillMstr appUserBillMstr = new AppUserBillMstr();
-        appUserBillMstr.buildCreateData();
-        appUserBillMstr.setAppUserId(consumeOrderDTO.getAppUserId());
-        if (rechargePasswordCard != null) {
-            appUserBillMstr.setBatchNo(rechargePasswordCard.getBatchNo());
-        }
-        if ((SysBoolType.NO.getCode().equals(consumeOrderDTO.getIsRefund())
-                && !OrderType.recharge.getCode().equals(consumeOrderDTO.getOrderType()))
-                || (SysBoolType.YES.getCode().equals(consumeOrderDTO.getIsRefund())
-                && OrderType.recharge.getCode().equals(consumeOrderDTO.getOrderType()))) {
-            appUserBillMstr.setBillType(OrderBillType.pay.getCode());
-            appUserBillMstr.setPayTotalAmount((rechargeAmount.add(giveAmount).add(welfareAmount)).multiply(new BigDecimal(-1)));
-            appUserBillMstr.setCashPayAmount(BigDecimal.ZERO);
-            appUserBillMstr.setRechargePayAmount(rechargeAmount.multiply(new BigDecimal(-1)));
-            appUserBillMstr.setGivePayAmount(giveAmount.multiply(new BigDecimal(-1)));
-            appUserBillMstr.setWelfarePayAmount(welfareAmount.multiply(new BigDecimal(-1)));
-        } else {
-            appUserBillMstr.setBillType(OrderBillType.recharge.getCode());
-            appUserBillMstr.setPayTotalAmount(rechargeAmount.add(giveAmount).add(welfareAmount));
-            appUserBillMstr.setCashPayAmount(BigDecimal.ZERO);
-            appUserBillMstr.setRechargePayAmount(rechargeAmount);
-            appUserBillMstr.setGivePayAmount(giveAmount);
-            appUserBillMstr.setWelfarePayAmount(welfareAmount);
-        }
-
-        switch (EnumUtils.getEnumByType(consumeOrderDTO.getOrderType(), OrderType.class)) {
-            case cloth: {
-                appUserBillMstr.setUsePoint(consumeOrderDTO.getPointAmount());
-                appUserBillMstr.setReceivePoint(0);
-                appUserBillMstr.setTitle("洗衣订单");
-                break;
-            }
-            case goods: {
-                appUserBillMstr.setUsePoint(consumeOrderDTO.getPointAmount());
-                appUserBillMstr.setReceivePoint(0);
-                appUserBillMstr.setTitle("商品订单");
-                break;
-            }
-            case life: {
-                appUserBillMstr.setUsePoint(consumeOrderDTO.getPointAmount());
-                appUserBillMstr.setReceivePoint(0);
-                appUserBillMstr.setTitle("生活服务");
-                break;
-            }
-            case car: {
-                appUserBillMstr.setUsePoint(consumeOrderDTO.getPointAmount());
-                appUserBillMstr.setReceivePoint(0);
-                appUserBillMstr.setTitle("汽车美容");
-                break;
-            }
-            case recharge: {
-                appUserBillMstr.setReceivePoint(consumeOrderDTO.getPointAmount());
-                appUserBillMstr.setUsePoint(0);
-                appUserBillMstr.setTitle("充值");
-                break;
-            }
-        }
-        appUserBillMstr.setIsRefund(consumeOrderDTO.getIsRefund());
-        appUserBillMstr.setOrderId(consumeOrderDTO.getOrderId());
-        appUserBillMstr.setOrderNo(consumeOrderDTO.getOrderNo());
-        appUserBillMstr.setOrderType(consumeOrderDTO.getOrderType());
-        appUserBillMstr.setOrgId(consumeOrderDTO.getStoreId());
-        appUserBillMstr.setPayType(consumeOrderDTO.getPayType());
-        if (rechargePasswordCard != null) {
-            appUserBillMstr.setRechargeCardId(rechargePasswordCard.getId());
-        }
-        return appUserBillMstr;
-    }
-
-
-    //<editor-folder desc="基础函数">
     @Override
     public List<RechargePasswordCardQueryVO> selectRechargePasswordCardList(PageVO pageVO) {
         return baseMapper.selectUserRechargePasswordCardList(pageVO, AuthHolder.userId());
@@ -789,6 +705,7 @@ public class RechargePasswordCardServiceImpl extends ServiceImpl<RechargePasswor
             BillMstrOrderDTO billMstrOrderDTO = new BillMstrOrderDTO();
             BeanUtils.copyProperties(consumeBillMstr, billMstrOrderDTO);
             billMstrOrderDTO.setStoreId(consumeBillMstr.getOrgId());
+            billMstrOrderDTO.setUseBindStoreId(rechargePasswordCard.getUseBindStoreId());
             billMstrOrderDTO.setRechargeCardNo(rechargePasswordCard.getCardNo());
             billMstrOrderDTO.setRemark("充值卡:" + rechargePasswordCard.getCardNo() + ",退款" + consumeBillMstr.getPayTotalAmount().negate() + "元");
             billMstrOrderService.saveRefundBillMstrOrder(billMstrOrderDTO);