Explorar el Código

修改账单控制器

qmj hace 5 días
padre
commit
34d87cda91

+ 1 - 0
.gitignore

@@ -10,3 +10,4 @@
 # Maven / Spring Boot
 # Maven / Spring Boot
 target/
 target/
 *.class
 *.class
+/nul

+ 0 - 0
foodie_admin_vue/src/api/system/ads.js~


+ 0 - 305
foodie_admin_vue/src/views/system/pointcontrol/pointTier.vue~

@@ -1,305 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item :label="$t('jifen.使用积分数量')" prop="points">
-        <el-input
-          v-model="queryParams.points"
-          placeholder=""
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item :label="$t('jifen.订单金额')" prop="orderCondition">
-        <el-input
-          v-model="queryParams.orderCondition"
-          placeholder=""
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item :label="$t('jifen.启用状态')" prop="isEnabled">
-        <el-select v-model="queryParams.isEnabled" placeholder="" clearable>
-          <el-option
-            :label="$t('jifen.开启')"
-            :value="1"
-          />
-          <el-option
-            :label="$t('jifen.关闭')"
-            :value="0"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">{{$t('jifen.搜索')}}</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">{{$t('jifen.重置')}}</el-button>
-      </el-form-item>
-    </el-form>
-
-    <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="['system:tier:add']"
-        >{{$t('jifen.新增')}}
-        </el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['system:tier:edit']"
-        >{{$t('jifen.修改')}}
-        </el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['system:tier:remove']"
-        >{{$t('jifen.删除')}}
-        </el-button>
-      </el-col>
-<!--      <el-col :span="1.5">-->
-<!--        <el-button-->
-<!--          type="warning"-->
-<!--          plain-->
-<!--          icon="el-icon-download"-->
-<!--          size="mini"-->
-<!--          @click="handleExport"-->
-<!--          v-hasPermi="['system:tier:export']"-->
-<!--        >导出-->
-<!--        </el-button>-->
-<!--      </el-col>-->
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table v-loading="loading" :data="tierList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center"/>
-      <el-table-column label="id" align="center" prop="id"/>
-      <el-table-column :label="$t('jifen.使用积分数量')" align="center" prop="points"/>
-      <el-table-column :label="$t('jifen.订单金额')" align="center" prop="orderCondition"/>
-      <el-table-column :label="$t('jifen.启用状态')" align="center" prop="isEnabled">
-        <template slot-scope="scope">
-          <div v-if="scope.row.isEnabled==1">{{ $t('jifen.开启') }}</div>
-          <div v-if="scope.row.isEnabled==0">{{ $t('jifen.关闭') }}</div>
-        </template>
-      </el-table-column>
-      <el-table-column :label="$t('jifen.操作')" align="center" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['system:tier:edit']"
-          >{{ $t('jifen.修改') }}
-          </el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['system:tier:remove']"
-          >{{ $t('jifen.删除') }}
-          </el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
-
-    <!-- 添加或修改积分使用梯次对话框 -->
-    <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=" $t('jifen.使用积分数量')" prop="points">
-          <el-input v-model="form.points" :placeholder="$t('jifen.请输入使用积分数量')"/>
-        </el-form-item>
-        <el-form-item :label=" $t('jifen.订单金额')" prop="orderCondition">
-          <el-input v-model="form.orderCondition" :placeholder="$t('jifen.订单金额达到该金额时生效')"/>
-        </el-form-item>
-        <el-form-item :label="$t('jifen.订单金额')启用状态" prop="isEnabled">
-          <el-radio-group v-model="form.isEnabled">
-            <el-radio :label="1">{{ $t('jifen.开启') }}</el-radio>
-            <el-radio :label="0">{{ $t('jifen.关闭') }}</el-radio>
-          </el-radio-group>
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">{{ $t('jifen.确 定') }}</el-button>
-        <el-button @click="cancel">{{ $t('jifen.取 消') }}</el-button>
-      </div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import {listTier, getTier, delTier, addTier, updateTier} from "@/api/system/pointTier";
-
-export default {
-  name: "Tier",
-  data() {
-    return {
-      // 遮罩层
-      loading: true,
-      // 选中数组
-      ids: [],
-      // 非单个禁用
-      single: true,
-      // 非多个禁用
-      multiple: true,
-      // 显示搜索条件
-      showSearch: true,
-      // 总条数
-      total: 0,
-      // 积分使用梯次表格数据
-      tierList: [],
-      // 弹出层标题
-      title: "",
-      // 是否显示弹出层
-      open: false,
-      // 查询参数
-      queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        points: null,
-        orderCondition: null,
-        isEnabled: null,
-        isDeleted: 0,
-      },
-      // 表单参数
-      form: {},
-      // 表单校验
-      rules: {
-        points: [
-          {required: true, message:this.$t("使用积分数量不能为空"), trigger: "blur"}
-        ],
-        orderCondition: [
-          {required: true, message: this.$t("订单金额不能为空"), trigger: "blur"}
-        ],
-        isEnabled: [
-          {required: true, message: this.$t("启用状态不能为空"), trigger: "blur"}
-        ],
-      }
-    };
-  },
-  created() {
-    this.getList();
-  },
-  methods: {
-    /** 查询积分使用梯次列表 */
-    getList() {
-      this.loading = true;
-      listTier(this.queryParams).then(response => {
-        this.tierList = response.rows;
-        this.total = response.total;
-        this.loading = false;
-      });
-    },
-    // 取消按钮
-    cancel() {
-      this.open = false;
-      this.reset();
-    },
-    // 表单重置
-    reset() {
-      this.form = {
-        id: null,
-        points: null,
-        orderCondition: null,
-        isEnabled: null,
-        isDeleted: null,
-        createTime: null,
-        updateTime: null
-      };
-      this.resetForm("form");
-    },
-    /** 搜索按钮操作 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
-    },
-    /** 重置按钮操作 */
-    resetQuery() {
-      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 = this.$t('jifen.新增');
-    },
-    /** 修改按钮操作 */
-    handleUpdate(row) {
-      this.reset();
-      const id = row.id || this.ids
-      getTier(id).then(response => {
-        this.form = response.data;
-        this.open = true;
-        this.title =this.$t('jifen.修改');
-      });
-    },
-    /** 提交按钮 */
-    submitForm() {
-      this.$refs["form"].validate(valid => {
-        if (valid) {
-          if (this.form.id != null) {
-            updateTier(this.form).then(response => {
-              this.$modal.msgSuccess(this.$t("jifen.修改成功"));
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            addTier(this.form).then(response => {
-              this.$modal.msgSuccess(this.$t("jifen.新增成功"));
-              this.open = false;
-              this.getList();
-            });
-          }
-        }
-      });
-    },
-    /** 删除按钮操作 */
-    handleDelete(row) {
-      const ids = row.id || this.ids;
-      this.$modal.confirm('是否确认删除数据项?').then(function () {
-        return delTier(ids);
-      }).then(() => {
-        this.getList();
-        this.$modal.msgSuccess("删除成功");
-      }).catch(() => {
-      });
-    },
-    /** 导出按钮操作 */
-    handleExport() {
-      this.download('system/tier/export', {
-        ...this.queryParams
-      }, `tier_${new Date().getTime()}.xlsx`)
-    }
-  }
-};
-</script>

+ 0 - 383
foodie_admin_vue/src/views/system/promotion/index.vue~

@@ -1,383 +0,0 @@
-<template>
-  <div class="app-container">
-
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" >
-      <el-form-item :label="$t('fenlei.活动名称')" prop="salesName">
-        <el-input
-          v-model="queryParams.salesName"
-          :placeholder="$t('fenlei.请输入活动名称')"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item :label="$t('fenlei.减免方式')" prop="salesType">
-        <el-select v-model="queryParams.salesType" :placeholder="$t('fenlei.请选择减免方式')" clearable>
-          <el-option
-            v-for="dict in dict.type.sys_sales_type"
-            :key="dict.value"
-            :label="generateTitle(dict.label)"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-<!--      <el-form-item :label="$t('fenlei.活动商家')" prop="shId">-->
-<!--        <el-input-->
-<!--          v-model="queryParams.shId"-->
-<!--          :placeholder="$t('fenlei.请输入活动商家')"-->
-<!--          clearable-->
-<!--          @keyup.enter.native="handleQuery"-->
-<!--        />-->
-<!--      </el-form-item>-->
-<!--      <el-form-item :label="$t('fenlei.活动商品')" prop="spId">-->
-<!--        <el-input-->
-<!--          v-model="queryParams.spId"-->
-<!--          :placeholder="$t('fenlei.请输入活动商品')"-->
-<!--          clearable-->
-<!--          @keyup.enter.native="handleQuery"-->
-<!--        />-->
-<!--      </el-form-item>-->
-      <el-form-item :label="$t('fenlei.结束日期')" prop="endTime">
-        <el-date-picker clearable
-          v-model="queryParams.endTime"
-          type="date"
-          value-format="yyyy-MM-dd"
-          :placeholder="$t('fenlei.请选择活动结束日期')">
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item :label="$t('fenlei.活动状态')" prop="salesState">
-        <el-select v-model="queryParams.salesState" :placeholder="$t('fenlei.请选择活动状态')" clearable>
-          <el-option
-            v-for="dict in dict.type.sys_sales_state"
-            :key="dict.value"
-            :label="generateTitle(dict.label)"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">{{$t('fenlei.搜索')}}</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">{{$t('fenlei.重置')}}</el-button>
-      </el-form-item>
-    </el-form>
-
-    <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="['system:promotion:add']"
-        >{{$t('fenlei.新增')}}</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table v-loading="loading" :data="promotionList" @selection-change="handleSelectionChange">
-      <el-table-column label="id"  width="100" align="center" prop="id" />
-      <el-table-column :label="$t('fenlei.活动名称')" align="center" prop="salesName" />
-      <el-table-column :label="$t('fenlei.减免方式')" align="center" prop="salesType">
-        <template slot-scope="scope">
-          <div v-if="scope.row.salesType==1">{{generateTitle('运费')}}</div>
-          <div v-if="scope.row.salesType==2">{{generateTitle('订单')}}</div>
-          <div v-if="scope.row.salesType==3">{{generateTitle('商品')}}</div>
-        </template>
-      </el-table-column>
-      <el-table-column :label="$t('fenlei.结束日期')" align="center" prop="endTime" width="180">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column :label="$t('fenlei.活动状态')" align="center" prop="salesState">
-        <template slot-scope="scope">
-          <el-tag v-if="scope.row.salesState==0" type="primary">{{generateTitle('启用')}}</el-tag>
-          <el-tag v-if="scope.row.salesState==1" type="danger">{{generateTitle('停用')}}</el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column :label="$t('fenlei.操作')" align="center" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-button
-            v-if="scope.row.shId==null"
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['system:promotion:edit']"
-          >{{$t('fenlei.修改')}}</el-button>
-          <el-button
-             v-if="scope.row.shId==null"
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['system:promotion:remove']"
-          >{{$t('fenlei.删除')}}</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
-
-    <!-- 添加或修改SalesPromotion对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="650px" append-to-body>
-      <!-- 红色提示框 -->
-      <el-alert
-        v-if="!form.edit"
-        :title="$t('youhuijuanquanyi.不能修改提示')"
-        type="error"
-        show-icon
-        :closable="false"
-        style="margin-bottom: 16px;"
-      />
-      <el-form ref="form" :model="form" :rules="rules" label-width="180px">
-        <el-form-item :label="$t('fenlei.活动名称')" prop="salesName">
-          <el-input v-model="form.salesName" :placeholder="$t('fenlei.请输入促销活动名称')" :readonly="!form.edit" />
-        </el-form-item>
-        <el-form-item :label="$t('fenlei.活动海报')" prop="poster">
-          <image-upload v-model="form.poster"/>
-        </el-form-item>
-        <el-form-item :label="$t('fenlei.减免方式')" prop="salesType">
-          <el-radio-group v-model="form.salesType" :disabled="!form.edit">
-            <el-radio
-              v-for="dict in dict.type.sys_sales_type"
-              :key="dict.value"
-              :label="dict.value"
-            >{{generateTitle(dict.label)}}</el-radio>
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item :label="$t('fenlei.减免值')" prop="salesReduction">
-          <el-input type="number" v-model="form.salesReduction" :placeholder="$t('fenlei.减免值说明')"  :readonly="!form.edit" />
-        </el-form-item>
-        <el-form-item :label="$t('fenlei.使用条件')" prop="salesCondition">
-          <el-input type="number" v-model="form.salesCondition" :placeholder="$t('fenlei.使用条件说明')"  :readonly="!form.edit" />
-        </el-form-item>
-        <el-form-item :label="$t('fenlei.可用次数')" prop="salesFund">
-          <el-input type="number" v-model="form.salesFund" :placeholder="$t('fenlei.可用次数说明')"  :readonly="!form.edit"/>
-        </el-form-item>
-        <el-form-item :label="$t('fenlei.结束日期')" prop="endTime">
-          <el-date-picker clearable
-            v-model="form.endTime"
-            type="date"
-            value-format="yyyy-MM-dd"
-            :placeholder="$t('fenlei.请选择活动结束日期')"  :readonly="!form.edit">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item :label="$t('fenlei.活动状态')" prop="salesState">
-          <el-radio-group v-model="form.salesState">
-            <el-radio
-              v-for="dict in dict.type.sys_sales_state"
-              :key="dict.value"
-              :label="dict.value"
-            >{{generateTitle(dict.label)}}</el-radio>
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item :label="$t('fenlei.活动说明')" prop="illustrate">
-          <el-input v-model="form.illustrate" type="textarea" :placeholder="$t('fenlei.请输入内容')" />
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">{{$t('fenlei.确定')}}</el-button>
-        <el-button @click="cancel">{{$t('fenlei.取消')}}</el-button>
-      </div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import { listPromotion, getPromotion, delPromotion, addPromotion, updatePromotion } from "@/api/system/promotion";
-import {generateTitle} from '../../../utils/i18.js'
-import Bus from "@/utils/Bus";
-export default {
-  name: "Promotion",
-  dicts: ['sys_sales_type', 'sys_sales_state'],
-  data() {
-    return {
-      language:null,
-      // 遮罩层
-      loading: true,
-      // 选中数组
-      ids: [],
-      // 非单个禁用
-      single: true,
-      // 非多个禁用
-      multiple: true,
-      // 显示搜索条件
-      showSearch: true,
-      // 总条数
-      total: 0,
-      // SalesPromotion表格数据
-      promotionList: [],
-      // 弹出层标题
-      title: "",
-      // 是否显示弹出层
-      open: false,
-      // 查询参数
-      queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        salesName: null,
-        salesType: null,
-        shId: null,
-        spId: null,
-        endTime: null,
-        salesState: null,
-        language:null,
-      },
-      // 表单参数
-      form: {edit:true},
-      // 表单校验
-      rules: {
-        salesName: [
-          { required: true, message: this.$t('fenlei.活动名不能空'), trigger: "blur" }
-        ],
-        salesType: [
-          { required: true, message: this.$t('fenlei.减免方式为必选'), trigger: "blur" }
-        ],
-        salesReduction: [
-          { required: true, message: this.$t('fenlei.减免值不能为空'), trigger: "blur" },
-          {
-            validator: (rule, value, callback) => {
-              // 当不是运费优惠(yhfangs≠1)时检查是否>0
-              if (this.form.salesType != 1 && value <= 0) {
-                callback(new Error(this.$t('fenlei.值必须大于0')));
-              } else {
-                callback();
-              }
-            },
-            trigger: 'blur'
-          }
-        ],
-        endTime: [
-          { required: true, message: this.$t('fenlei.结束日期为必选'), trigger: "blur" }
-        ],
-        salesState: [
-          { required: true, message: this.$t('fenlei.活动状态为必选'), trigger: "blur" }
-        ],
-      }
-    };
-  },
-  created() {
-    this.language =localStorage.getItem('lang')
-    this.getList();
-  },
-  mounted() {
-    // 确保Bus监听已建立
-    Bus.$on('l18zh', (res) => {
-      this.language = res;
-      this.getList();
-    })
-  },
-  methods: {
-    generateTitle,
-    /** 查询SalesPromotion列表 */
-    getList() {
-      this.loading = true;
-      this.queryParams.language= this.language=='zh_CN'?'2':this.language=='zh_TW'?'3':this.language=='en_US'?'1':'0';
-      listPromotion(this.queryParams).then(response => {
-        this.promotionList = response.rows;
-        this.total = response.total;
-        this.loading = false;
-      });
-    },
-    // 取消按钮
-    cancel() {
-      this.open = false;
-      this.reset();
-    },
-    // 表单重置
-    reset() {
-      this.form = {
-        id: null,
-        salesName: null,
-        salesType: null,
-        salesReduction: null,
-        salesCondition: null,
-        salesFund: null,
-        endTime: null,
-        poster: null,
-        salesState: null,
-        illustrate: null,
-        language:null,
-        edit: true
-      };
-      this.resetForm("form");
-    },
-    /** 搜索按钮操作 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
-    },
-    /** 重置按钮操作 */
-    resetQuery() {
-      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 = this.$t('fenlei.新增');
-    },
-    /** 修改按钮操作 */
-    handleUpdate(row) {
-      this.reset();
-      const id = row.id || this.ids
-      getPromotion(id).then(response => {
-        this.form = response.data;
-        this.open = true;
-        this.title = this.$t('fenlei.修改');
-      });
-    },
-    /** 提交按钮 */
-    submitForm() {
-      this.$refs["form"].validate(valid => {
-        if (valid) {
-          if (this.form.id != null) {
-            updatePromotion(this.form).then(response => {
-              this.$modal.msgSuccess(this.$t('fenlei.修改成功'));
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            this.form.language= this.language=='zh_CN'?'2':this.language=='zh_TW'?'3':this.language=='en_US'?'1':'0';
-            addPromotion(this.form).then(response => {
-              this.$modal.msgSuccess(this.$t('fenlei.新增成功'));
-              this.open = false;
-              this.getList();
-            });
-          }
-        }
-      });
-    },
-    /** 删除按钮操作 */
-    handleDelete(row) {
-      const ids = row.id || this.ids;
-      this.$modal.confirm(this.$t('fenlei.是否确认删除门店分类编号为') + ids + this.$t('fenlei.的数据项')).then(function() {
-        return delPromotion(ids);
-      }).then(() => {
-        this.getList();
-        this.$modal.msgSuccess(this.$t('fenlei.删除成功'));
-      }).catch(() => {});
-    },
-    /** 导出按钮操作 */
-    handleExport() {
-      this.download('system/promotion/export', {
-        ...this.queryParams
-      }, `promotion_${new Date().getTime()}.xlsx`)
-    }
-  }
-};
-</script>

+ 261 - 127
ruoyi-admin/src/main/java/com/ruoyi/app/pay/UserBillingController.java

@@ -1,6 +1,6 @@
 package com.ruoyi.app.pay;
 package com.ruoyi.app.pay;
 
 
-import com.alibaba.fastjson.JSON;
+import cn.hutool.core.convert.Convert;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -8,37 +8,36 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.app.order.ZaloPayCommonService;
 import com.ruoyi.app.order.ZaloPayCommonService;
+import com.ruoyi.app.pay.dto.QsBillingDto;
+import com.ruoyi.common.core.domain.entity.SysDictData;
+import com.ruoyi.common.utils.DictUtils;
+import com.ruoyi.system.domain.vo.ShBillingDto;
 import com.ruoyi.app.utils.DateUtil;
 import com.ruoyi.app.utils.DateUtil;
-import com.ruoyi.app.utils.IpUtils;
-import com.ruoyi.app.utils.Md5Pay;
 import com.ruoyi.app.utils.zaloPay.ZaloPay;
 import com.ruoyi.app.utils.zaloPay.ZaloPay;
 import com.ruoyi.app.utils.zaloPay.ZaloPayConfig;
 import com.ruoyi.app.utils.zaloPay.ZaloPayConfig;
-import com.ruoyi.app.utils.zaloPay.ZaloPayCreateOrderResponse;
 import com.ruoyi.common.annotation.Anonymous;
 import com.ruoyi.common.annotation.Anonymous;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.annotation.RepeatSubmit;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.MessageUtils;
 import com.ruoyi.common.utils.MessageUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.system.domain.PosOrder;
-import com.ruoyi.system.domain.UserBilling;
+import com.ruoyi.system.domain.*;
 import com.ruoyi.system.domain.vo.BillDTO;
 import com.ruoyi.system.domain.vo.BillDTO;
 import com.ruoyi.system.mapper.UserBillingMapper;
 import com.ruoyi.system.mapper.UserBillingMapper;
-import com.ruoyi.system.service.IInfoUserService;
-import com.ruoyi.system.service.IPosOrderService;
-import com.ruoyi.system.service.IUserBillingService;
+import com.ruoyi.system.service.*;
 import com.ruoyi.system.utils.Auth;
 import com.ruoyi.system.utils.Auth;
 import com.ruoyi.system.utils.JwtUtil;
 import com.ruoyi.system.utils.JwtUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
-import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.servlet.http.HttpServletResponse;
+
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -50,8 +49,7 @@ import java.util.stream.Collectors;
  */
  */
 @RestController
 @RestController
 @RequestMapping("/Billing/billing")
 @RequestMapping("/Billing/billing")
-public class UserBillingController extends BaseController
-{
+public class UserBillingController extends BaseController {
     @Autowired
     @Autowired
     private IUserBillingService userBillingService;
     private IUserBillingService userBillingService;
     @Autowired
     @Autowired
@@ -66,9 +64,14 @@ public class UserBillingController extends BaseController
     private ZaloPayConfig zaloPayConfig;
     private ZaloPayConfig zaloPayConfig;
     @Autowired
     @Autowired
     private ZaloPay zaloPay;
     private ZaloPay zaloPay;
+    @Autowired
+    private IPosOrderRatingService posOrderRatingService;
+    @Autowired
+    private ICommissionRatesService commissionRatesService;
 
 
     /**
     /**
      * 商家日账单数据
      * 商家日账单数据
+     *
      * @param token
      * @param token
      * @param page
      * @param page
      * @param size
      * @param size
@@ -79,24 +82,61 @@ public class UserBillingController extends BaseController
     @Auth
     @Auth
     @GetMapping("/getzddaylist")
     @GetMapping("/getzddaylist")
     public AjaxResult getzddaylist(@RequestHeader String token,
     public AjaxResult getzddaylist(@RequestHeader String token,
-                                    @RequestParam Long page,
-                                    @RequestParam Long size,
-                                    @RequestParam String riqi)
-    {
+                                   @RequestParam Long page,
+                                   @RequestParam Long size,
+                                   @RequestParam String riqi,
+                                   @RequestParam(required = false) Boolean isCancel
+    ) {
         JwtUtil jwtUtil = new JwtUtil();
         JwtUtil jwtUtil = new JwtUtil();
         Long id = Long.valueOf(jwtUtil.getusid(token));
         Long id = Long.valueOf(jwtUtil.getusid(token));
-        List<UserBilling> list = userBillingMapper.getdaylist(id,riqi,(page-1)*size,size);
+        InfoUser user = infoUserService.getById(id);
+        //获取日的取消订单列表
+        if (isCancel != null && isCancel) {
+            return getDayCancleOrderList(page, size, riqi, user);
+        }
+        List<UserBilling> list = userBillingMapper.getdaylist(id, riqi, (page - 1) * size, size);
         setYhInfo(list);
         setYhInfo(list);
-        BillDTO sum = userBillingMapper.getdaysum(id,riqi);
+        BillDTO sum = userBillingMapper.getdaysum(id, riqi);
         JSONObject org = new JSONObject();
         JSONObject org = new JSONObject();
-        org.put("shul",sum.getSul());
-        org.put("sum",sum.getShouru());
-        org.put("list",list);
+        org.put("shul", sum.getSul());
+        org.put("sum", sum.getShouru());
+        org.put("commission", sum.getCommission());
+        org.put("tax", sum.getTax());
+        org.put("behalfAmount", sum.getBehalfAmount());
+        LambdaQueryWrapper<PosOrder> queryWrapper = new LambdaQueryWrapper<PosOrder>()
+                .in(PosOrder::getState, new ArrayList<Long>(Arrays.asList(9L, 10L)))
+                .apply("(sh_id=" + id + " or qs_id=" + id + ") and date_format (cretim,'%Y-%m-%d %H:%i:%s') >= date_format ('" + riqi + " 00:00:00','%Y-%m-%d %H:%i:%s') and date_format (cretim,'%Y-%m-%d %H:%i:%s') <= date_format ('" + riqi + " 23:59:59','%Y-%m-%d %H:%i:%s')");
+        // 取消总数 ,作废、客服介入的数据
+        long cancleCount = posOrderService.count(queryWrapper);
+        org.put("cancelCount", cancleCount);
+
+        if ("2".equals(user.getUserType())) {
+            setQsList(list, org);
+        } else {
+            ShBillingDto shBillingDto = userBillingMapper.getShDaysum(id, riqi);
+            org.put("foodAmount", shBillingDto.getFoodAmount());
+            org.put("shYh", shBillingDto.getShYh());
+            setShList(list, org, user);
+        }
+        return success(MessageUtils.message("no.success"), org);
+    }
+
+    //按日获取取消订单列表
+    public AjaxResult getDayCancleOrderList(Long page, Long size, String riqi, InfoUser user) {
+        JSONObject org = new JSONObject();
+        Page<PosOrder> pageInput = new Page<>(page, size);
+        LambdaQueryWrapper<PosOrder> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(PosOrder::getState, new ArrayList<Long>(Arrays.asList(9L, 10L)));
+        queryWrapper.apply("(sh_id=" + user.getUserId() + " or qs_id=" + user.getUserId() + ") and date_format (cretim,'%Y-%m-%d %H:%i:%s') >= date_format ('" + riqi + " 00:00:00','%Y-%m-%d %H:%i:%s') and date_format (cretim,'%Y-%m-%d %H:%i:%s') <= date_format ('" + riqi + " 23:59:59','%Y-%m-%d %H:%i:%s')");
+        queryWrapper.orderByDesc(PosOrder::getCretim);
+        IPage<PosOrder> datas = posOrderService.page(pageInput, queryWrapper);
+        org.put("list", datas.getRecords());
         return success(MessageUtils.message("no.success"), org);
         return success(MessageUtils.message("no.success"), org);
     }
     }
 
 
     /**
     /**
      * 商家周账单数据
      * 商家周账单数据
+     *
      * @param token
      * @param token
      * @param page
      * @param page
      * @param size
      * @param size
@@ -107,27 +147,119 @@ public class UserBillingController extends BaseController
     @Auth
     @Auth
     @GetMapping("/getzdmeeklist")
     @GetMapping("/getzdmeeklist")
     public AjaxResult getzdmeeklist(@RequestHeader String token,
     public AjaxResult getzdmeeklist(@RequestHeader String token,
-                                   @RequestParam Long page,
-                                   @RequestParam Long size,
-                                   @RequestParam String riqi)
-    {
+                                    @RequestParam Long page,
+                                    @RequestParam Long size,
+                                    @RequestParam String riqi,
+                                    @RequestParam(required = false) Boolean isCancel) {
         JwtUtil jwtUtil = new JwtUtil();
         JwtUtil jwtUtil = new JwtUtil();
         Long id = Long.valueOf(jwtUtil.getusid(token));
         Long id = Long.valueOf(jwtUtil.getusid(token));
-        List<UserBilling> list = userBillingMapper.getmeeklist(id,riqi,(page-1)*size,size);
+        InfoUser user = infoUserService.getById(id);
+        //获取日的取消订单列表
+        if (isCancel != null && isCancel) {
+            return getWeekCancleOrderList(page, size, riqi, user);
+        }
+        List<UserBilling> list = userBillingMapper.getmeeklist(id, riqi, (page - 1) * size, size);
         setYhInfo(list);
         setYhInfo(list);
-        BillDTO sum = userBillingMapper.getmeeksum(id,riqi);
+        BillDTO sum = userBillingMapper.getmeeksum(id, riqi);
+        JSONObject org = new JSONObject();
+        org.put("shul", sum.getSul()); //数量
+        org.put("sum", sum.getShouru());
+        org.put("commission", sum.getCommission());
+        org.put("tax", sum.getTax());
+        org.put("behalfAmount", sum.getBehalfAmount());
+        LambdaQueryWrapper<PosOrder> queryWrapper = new LambdaQueryWrapper<PosOrder>()
+                .in(PosOrder::getState, new ArrayList<Long>(Arrays.asList(9L, 10L)))
+                .apply("(sh_id=" + id + " or qs_id=" + id + ") and WEEK(cretim) = WEEK(" + riqi + ") and  YEAR(cretim) = YEAR(" + riqi + ")");
+        // 取消总数 ,作废、客服介入的数据
+        long cancleCount = posOrderService.count(queryWrapper);
+        org.put("cancelCount", cancleCount);
+        if ("2".equals(user.getUserType())) {
+            setQsList(list, org);
+        } else {
+            ShBillingDto shBillingDto = userBillingMapper.getShMeeksum(id, riqi);
+            org.put("foodAmount", shBillingDto.getFoodAmount());
+            org.put("shYh", shBillingDto.getShYh());
+            setShList(list, org, user);
+
+        }
+        return success(MessageUtils.message("no.success"), org);
+    }
+
+    //按周获取取消订单列表
+    public AjaxResult getWeekCancleOrderList(Long page, Long size, String riqi, InfoUser user) {
         JSONObject org = new JSONObject();
         JSONObject org = new JSONObject();
-        org.put("shul",sum.getSul());
-        org.put("sum",sum.getShouru());
-        org.put("list",list);
+        Page<PosOrder> pageInput = new Page<>(page, size);
+        LambdaQueryWrapper<PosOrder> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(PosOrder::getState, new ArrayList<Long>(Arrays.asList(9L, 10L)));
+        queryWrapper.apply("(sh_id=" + user.getUserId() + " or qs_id=" + user.getUserId() + ") and WEEK(cretim) = WEEK(" + riqi + ") and  YEAR(cretim) = YEAR(" + riqi + ")");
+        queryWrapper.orderByDesc(PosOrder::getCretim);
+        IPage<PosOrder> datas = posOrderService.page(pageInput, queryWrapper);
+        org.put("list", datas.getRecords());
         return success(MessageUtils.message("no.success"), org);
         return success(MessageUtils.message("no.success"), org);
     }
     }
 
 
+    //返回商户账单信息
+    private void setShList(List<UserBilling> list, JSONObject org, InfoUser user) {
+        List<ShBillingDto> result = new ArrayList<>();
+        if (!list.isEmpty()) {
+            List<Long> ddIds = list.stream().map(x -> Long.valueOf(x.getDdId())).collect(Collectors.toList());
+            List<PosOrder> orders = posOrderService.list(new LambdaQueryWrapper<PosOrder>().in(PosOrder::getDdId, ddIds));
+            List<PosOrderRating> ratings = posOrderRatingService.list(new LambdaQueryWrapper<PosOrderRating>().in(PosOrderRating::getDdId, ddIds));
+            list.forEach(x -> {
+                ShBillingDto dto = Convert.convert(ShBillingDto.class, x);
+                //货到付款的订单金额
+                orders.stream().filter(o -> o.getDdId().equals(Long.valueOf(x.getDdId()))).findFirst().ifPresent(o -> {
+                    dto.setFoodAmount(o.getFoodAmount());
+                    int shYh = (o.getMdDiscountAmount() == null ? 0 : o.getMdDiscountAmount()) + (o.getMdSalesReduction() == null ? 0 : o.getMdSalesReduction());
+                    dto.setShYh((double) shYh);
+                });
+                ratings.stream().filter(r -> r.getDdId().equals(Long.valueOf(x.getDdId()))).findFirst().ifPresent(r -> dto.setShStarts(r.getQsStars()));
+                result.add(dto);
+            });
+        }
+        double bl = user.getCommission() == null ? 0.00 : user.getCommission();
+        bl = commissionRatesService.getShCommissionRate(bl, user.getUserId());
+        org.put("commissionRate", bl);
+        org.put("list", result);
+    }
+
+    //骑手返回骑手账单信息
+    private void setQsList(List<UserBilling> list, JSONObject org) {
+        List<QsBillingDto> result = new ArrayList<>();
+        if (!list.isEmpty()) {
+            List<Long> ddIds = list.stream().map(x -> Long.valueOf(x.getDdId())).collect(Collectors.toList());
+            List<PosOrder> orders = posOrderService.list(new LambdaQueryWrapper<PosOrder>().in(PosOrder::getDdId, ddIds));
+            List<PosOrderRating> ratings = posOrderRatingService.list(new LambdaQueryWrapper<PosOrderRating>().in(PosOrderRating::getDdId, ddIds));
+            list.forEach(x -> {
+                QsBillingDto dto = Convert.convert(QsBillingDto.class, x);
+                //货到付款的订单金额
+                orders.stream().filter(o -> o.getDdId().equals(Long.valueOf(x.getDdId()))).findFirst().ifPresent(o -> {
+                    if ("1".equals(o.getCollectPayment())) {
+                        dto.setOrderAmount(o.getAmount());
+                    }
+                    dto.setFreight(o.getFreight());
+                    dto.setJvli(o.getJvli());
+                });
+                ratings.stream().filter(r -> r.getDdId().equals(Long.valueOf(x.getDdId()))).findFirst().ifPresent(r -> dto.setQsStarts(r.getQsStars()));
+                result.add(dto);
+            });
+        }
+        String taxRate="0";
+        List<SysDictData> taxBlData = DictUtils.getDictCache("sys_qs_freight_bl");
+
+        if (taxBlData != null && taxBlData.get(0) != null) {
+            taxRate = taxBlData.get(0).getDictValue();
+        }
+        org.put("taxRate", taxRate);
+        org.put("list", result);
+    }
+
+
     private void setYhInfo(List<UserBilling> list) {
     private void setYhInfo(List<UserBilling> list) {
-        if(!list.isEmpty()){
-            List<String> orderIds=list.stream().map(UserBilling::getDdId).collect(Collectors.toList());
+        if (!list.isEmpty()) {
+            List<String> orderIds = list.stream().map(UserBilling::getDdId).collect(Collectors.toList());
             LambdaQueryWrapper<PosOrder> query = new LambdaQueryWrapper<>();
             LambdaQueryWrapper<PosOrder> query = new LambdaQueryWrapper<>();
-            query.in(PosOrder::getDdId,orderIds);
+            query.in(PosOrder::getDdId, orderIds);
             List<PosOrder> orders = posOrderService.list(query);
             List<PosOrder> orders = posOrderService.list(query);
             list.forEach(billing -> {
             list.forEach(billing -> {
                 orders.stream().filter(o -> o.getDdId().toString().equals(billing.getDdId())).findFirst().ifPresent(o -> {
                 orders.stream().filter(o -> o.getDdId().toString().equals(billing.getDdId())).findFirst().ifPresent(o -> {
@@ -153,6 +285,7 @@ public class UserBillingController extends BaseController
 
 
     /**
     /**
      * 商家月账单数据
      * 商家月账单数据
+     *
      * @param token
      * @param token
      * @param page
      * @param page
      * @param size
      * @param size
@@ -163,94 +296,55 @@ public class UserBillingController extends BaseController
     @Auth
     @Auth
     @GetMapping("/getzdmatlist")
     @GetMapping("/getzdmatlist")
     public AjaxResult getzdmatlist(@RequestHeader String token,
     public AjaxResult getzdmatlist(@RequestHeader String token,
-                                @RequestParam Long page,
-                                @RequestParam Long size,
-                                @RequestParam String riqi)
-    {
+                                   @RequestParam Long page,
+                                   @RequestParam Long size,
+                                   @RequestParam String riqi,
+                                   @RequestParam(required = false) Boolean isCancel) {
         JwtUtil jwtUtil = new JwtUtil();
         JwtUtil jwtUtil = new JwtUtil();
         Long id = Long.valueOf(jwtUtil.getusid(token));
         Long id = Long.valueOf(jwtUtil.getusid(token));
-        List<UserBilling> list = userBillingMapper.getmatlist(id,riqi,(page-1)*size,size);
+        InfoUser user = infoUserService.getById(id);
+        if (isCancel != null && isCancel) {
+            return getMonthCancleOrderList(page, size, riqi, user);
+        }
+        List<UserBilling> list = userBillingMapper.getmatlist(id, riqi, (page - 1) * size, size);
         setYhInfo(list);
         setYhInfo(list);
-        BillDTO sum = userBillingMapper.getmatsum(id,riqi);
+        BillDTO sum = userBillingMapper.getmatsum(id, riqi);
         JSONObject org = new JSONObject();
         JSONObject org = new JSONObject();
-        org.put("shul",sum.getSul());
-        org.put("sum",sum.getShouru());
-        org.put("list",list);
-        return success(MessageUtils.message("no.success"), org);
-    }
-
-    //充值
-    @Anonymous
-    @Auth
-    @RepeatSubmit(interval = 1000, message = "请求过于频繁")
-    @RequestMapping(value = "/userRecharge", method = {RequestMethod.GET,RequestMethod.POST})
-    public AjaxResult userRecharge(@RequestHeader String token, @RequestParam String language, @RequestParam Long amount, HttpServletRequest request)
-    {
-        JwtUtil jwtUtil = new JwtUtil();
-        IpUtils ipUtils = new IpUtils();
-        String ip = ipUtils.getIpAddr(request);
-        String id = jwtUtil.getusid(token);
-        Long timeLong = System.currentTimeMillis();
-        Md5Pay md5Pay = new Md5Pay();
-        String orderid = "CZ"+timeLong;
-        System.out.println("orderid:"+orderid);
-        String obj =  md5Pay.VNPay(language,orderid,String.valueOf(amount),ip);
-        UserBilling billing = new UserBilling();
-        billing.setUserId(Long.valueOf(id));
-        billing.setType(String.valueOf(1));
-        billing.setDdId(orderid);
-        billing.setAmount(Double.valueOf(amount));
-        billing.setState(String.valueOf(3));
-        billing.setIllustrate("用户充值");
-        billing.setPaymentMethod("app线上充值");
-        billing.setUrl(obj);
-        Boolean reg = userBillingService.saveOrUpdate(billing);
-        if(reg){
-            return success(MessageUtils.message("no.order.create.success"), obj);
-        }else {
-            return error();
+        org.put("shul", sum.getSul());
+        org.put("sum", sum.getShouru());
+        org.put("commission", sum.getCommission());
+        org.put("tax", sum.getTax());
+        org.put("behalfAmount", sum.getBehalfAmount());
+        LambdaQueryWrapper<PosOrder> queryWrapper = new LambdaQueryWrapper<PosOrder>()
+                .in(PosOrder::getState, new ArrayList<Long>(Arrays.asList(9L, 10L)))
+                .apply("(sh_id=" + id + " or qs_id=" + id + ") and DATE_FORMAT(cretim, '%Y-%m') = " + riqi);
+        // 取消总数 ,作废、客服介入的数据
+        long cancleCount = posOrderService.count(queryWrapper);
+        org.put("cancelCount", cancleCount);
+        if ("2".equals(user.getUserType())) {
+            setQsList(list, org);
+        } else {
+            ShBillingDto shBillingDto = userBillingMapper.getshMonthsum(id, riqi);
+            org.put("foodAmount", shBillingDto.getFoodAmount());
+            org.put("shYh", shBillingDto.getShYh());
+            setShList(list, org, user);
         }
         }
+        return success(MessageUtils.message("no.success"), org);
     }
     }
 
 
-
-    /**
-     *  充值使用ZaloPay
-     * @param token
-     * @param language
-     * @param amount
-     * @param request
-     * @return
-     */
-    @Anonymous
-    @Auth
-    @RepeatSubmit(interval = 1000, message = "请求过于频繁")
-    @RequestMapping(value = "/userRechargeZaloPay", method = {RequestMethod.GET,RequestMethod.POST})
-    public AjaxResult userRechargeZaloPay(@RequestHeader String token, @RequestParam String language, @RequestParam Long amount,@RequestParam String payType, HttpServletRequest request) throws Exception {
-        JwtUtil jwtUtil = new JwtUtil();
-        String userId = jwtUtil.getusid(token);
-        Long timeLong = System.currentTimeMillis();
-        String orderid = "CZ"+timeLong;
-        System.out.println("orderid:"+orderid);
-        ZaloPayCreateOrderResponse obj =  zaloPay.createOrder(userId,orderid,amount,"user recharch by zalopay",zaloPayConfig.getZaloPayConfig(payType));
-        zaloPayCommonService.setZaloPayOrder(orderid, JSON.toJSONString(obj),null,null,null,payType);
-        UserBilling billing = new UserBilling();
-        billing.setUserId(Long.valueOf(userId));
-        billing.setType(String.valueOf(1));
-        billing.setDdId(orderid);
-        billing.setAmount(Double.valueOf(amount));
-        billing.setState(String.valueOf(3));
-        billing.setIllustrate("用户充值");
-        billing.setPaymentMethod("zalopay线上充值");
-        billing.setUrl(JSONObject.toJSONString(obj));
-        Boolean reg = userBillingService.saveOrUpdate(billing);
-        if(reg){
-            return success(MessageUtils.message("no.order.create.success"), obj);
-        }else {
-            return error();
-        }
+    //按周获取取消订单列表
+    public AjaxResult getMonthCancleOrderList(Long page, Long size, String riqi, InfoUser user) {
+        JSONObject org = new JSONObject();
+        Page<PosOrder> pageInput = new Page<>(page, size);
+        LambdaQueryWrapper<PosOrder> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(PosOrder::getState, new ArrayList<Long>(Arrays.asList(9L, 10L)));
+        queryWrapper.apply("(sh_id=" + user.getUserId() + " or qs_id=" + user.getUserId() + ") and DATE_FORMAT(cretim, '%Y-%m') = " + riqi);
+        queryWrapper.orderByDesc(PosOrder::getCretim);
+        IPage<PosOrder> datas = posOrderService.page(pageInput, queryWrapper);
+        org.put("list", datas.getRecords());
+        return success(MessageUtils.message("no.success"), org);
     }
     }
 
 
-
     //查询用户账户及余额
     //查询用户账户及余额
     @Anonymous
     @Anonymous
     @Auth
     @Auth
@@ -332,15 +426,33 @@ public class UserBillingController extends BaseController
             return success(MessageUtils.message("no.success"), org);
             return success(MessageUtils.message("no.success"), org);
         }
         }
     }
     }
+
     /**
     /**
      * 查询Billing列表
      * 查询Billing列表
      */
      */
     @PreAuthorize("@ss.hasPermi('Billing:billing:list')")
     @PreAuthorize("@ss.hasPermi('Billing:billing:list')")
     @GetMapping("/list")
     @GetMapping("/list")
-    public TableDataInfo list(UserBilling userBilling)
-    {
+    public TableDataInfo list(UserBilling userBilling) {
         startPage();
         startPage();
+        String[] dr = userBilling.getDateRange();
+        if (dr != null && dr.length == 2) {
+            userBilling.setCretimStart(dr[0]);
+            userBilling.setCretimEnd(dr[1]);
+        }
         List<UserBilling> list = userBillingService.selectUserBillingList(userBilling);
         List<UserBilling> list = userBillingService.selectUserBillingList(userBilling);
+        if (!list.isEmpty()) {
+            List<Long> userIds = list.stream().map(UserBilling::getUserId).collect(Collectors.toList());
+            List<InfoUser> users = infoUserService.list(new LambdaQueryWrapper<InfoUser>().in(InfoUser::getUserId, userIds));
+            list.forEach(x -> {
+                users.stream().filter(u -> u.getUserId().equals(x.getUserId())).findFirst().ifPresent(y -> {
+                    x.setUserName(y.getUserName());
+                    if ("0".equals(y.getUserType())) {
+                        x.setUserName(y.getPhone());
+                    }
+                    x.setUserType(y.getUserType());
+                });
+            });
+        }
         return getDataTable(list);
         return getDataTable(list);
     }
     }
 
 
@@ -350,9 +462,26 @@ public class UserBillingController extends BaseController
     @PreAuthorize("@ss.hasPermi('Billing:billing:export')")
     @PreAuthorize("@ss.hasPermi('Billing:billing:export')")
     @Log(title = "Billing", businessType = BusinessType.EXPORT)
     @Log(title = "Billing", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     @PostMapping("/export")
-    public void export(HttpServletResponse response, UserBilling userBilling)
-    {
+    public void export(HttpServletResponse response, UserBilling userBilling) {
+        String[] dr = userBilling.getDateRange();
+        if (dr != null && dr.length == 2) {
+            userBilling.setCretimStart(dr[0]);
+            userBilling.setCretimEnd(dr[1]);
+        }
         List<UserBilling> list = userBillingService.selectUserBillingList(userBilling);
         List<UserBilling> list = userBillingService.selectUserBillingList(userBilling);
+        if (!list.isEmpty()) {
+            List<Long> userIds = list.stream().map(UserBilling::getUserId).collect(Collectors.toList());
+            List<InfoUser> users = infoUserService.list(new LambdaQueryWrapper<InfoUser>().in(InfoUser::getUserId, userIds));
+            list.forEach(x -> {
+                users.stream().filter(u -> u.getUserId().equals(x.getUserId())).findFirst().ifPresent(y -> {
+                    x.setUserName(y.getUserName());
+                    if ("0".equals(y.getUserType())) {
+                        x.setUserName(y.getPhone());
+                    }
+                    x.setUserType(y.getUserType());
+                });
+            });
+        }
         ExcelUtil<UserBilling> util = new ExcelUtil<UserBilling>(UserBilling.class);
         ExcelUtil<UserBilling> util = new ExcelUtil<UserBilling>(UserBilling.class);
         util.exportExcel(response, list, MessageUtils.message("no.export.excel.billing"));
         util.exportExcel(response, list, MessageUtils.message("no.export.excel.billing"));
     }
     }
@@ -362,9 +491,17 @@ public class UserBillingController extends BaseController
      */
      */
     @PreAuthorize("@ss.hasPermi('Billing:billing:query')")
     @PreAuthorize("@ss.hasPermi('Billing:billing:query')")
     @GetMapping(value = "/{id}")
     @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Long id)
-    {
-        return success(userBillingService.selectUserBillingById(id));
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
+        UserBilling result = userBillingService.selectUserBillingById(id);
+        if (result != null) {
+            InfoUser user = infoUserService.getById(result.getUserId());
+            result.setUserName(user.getUserName());
+            if ("0".equals(user.getUserType())) {
+                result.setUserName(user.getPhone());
+            }
+            result.setUserType(user.getUserType());
+        }
+        return success(result);
     }
     }
 
 
     /**
     /**
@@ -373,8 +510,7 @@ public class UserBillingController extends BaseController
     @PreAuthorize("@ss.hasPermi('Billing:billing:add')")
     @PreAuthorize("@ss.hasPermi('Billing:billing:add')")
     @Log(title = "Billing", businessType = BusinessType.INSERT)
     @Log(title = "Billing", businessType = BusinessType.INSERT)
     @PostMapping
     @PostMapping
-    public AjaxResult add(@RequestBody UserBilling userBilling)
-    {
+    public AjaxResult add(@RequestBody UserBilling userBilling) {
         return toAjax(userBillingService.insertUserBilling(userBilling));
         return toAjax(userBillingService.insertUserBilling(userBilling));
     }
     }
 
 
@@ -384,8 +520,7 @@ public class UserBillingController extends BaseController
     @PreAuthorize("@ss.hasPermi('Billing:billing:edit')")
     @PreAuthorize("@ss.hasPermi('Billing:billing:edit')")
     @Log(title = "Billing", businessType = BusinessType.UPDATE)
     @Log(title = "Billing", businessType = BusinessType.UPDATE)
     @PutMapping
     @PutMapping
-    public AjaxResult edit(@RequestBody UserBilling userBilling)
-    {
+    public AjaxResult edit(@RequestBody UserBilling userBilling) {
         return toAjax(userBillingService.updateUserBilling(userBilling));
         return toAjax(userBillingService.updateUserBilling(userBilling));
     }
     }
 
 
@@ -394,9 +529,8 @@ public class UserBillingController extends BaseController
      */
      */
     @PreAuthorize("@ss.hasPermi('Billing:billing:remove')")
     @PreAuthorize("@ss.hasPermi('Billing:billing:remove')")
     @Log(title = "Billing", businessType = BusinessType.DELETE)
     @Log(title = "Billing", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids)
-    {
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
         return toAjax(userBillingService.deleteUserBillingByIds(ids));
         return toAjax(userBillingService.deleteUserBillingByIds(ids));
     }
     }
 }
 }

+ 26 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/pay/dto/QsBillingDto.java

@@ -0,0 +1,26 @@
+package com.ruoyi.app.pay.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.system.domain.UserBilling;
+import lombok.Data;
+
+@Data
+public class QsBillingDto extends UserBilling {
+    /**
+     * 骑手星级
+     */
+    public Double qsStarts;
+
+    /**
+     * 订单金额(货到付款)
+     */
+    public Integer orderAmount;
+    /**
+     * 距离
+     */
+    private Double jvli;
+    /** 运费 */
+
+    private Double freight;
+}

+ 0 - 140
ruoyi-admin/src/main/java/com/ruoyi/app/utils/DateUtil.java~

@@ -1,140 +0,0 @@
-package com.ruoyi.app.utils;
-
-import lombok.SneakyThrows;
-
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.time.LocalTime;
-import java.time.format.DateTimeFormatter;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Locale;
-
-public class DateUtil {
-
-    //获取当前时间戳
-    public Long getTimeMillis() throws ParseException {
-        return System.currentTimeMillis();
-    }
-    //判断多少天后的日期
-    public String addDate(String date,int days) throws ParseException {
-        Calendar calendar = Calendar.getInstance();
-        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
-        Date parse = format.parse(date);
-        calendar.setTime(parse);
-        int year = calendar.get(Calendar.YEAR);
-        int month = calendar.get(Calendar.MONTH);
-        int day = calendar.get(Calendar.DAY_OF_MONTH);
-        // days  多少天后的日期
-        int newDay = day+days;
-        calendar.set(Calendar.YEAR,year);
-        calendar.set(Calendar.MONTH,month);
-        calendar.set(Calendar.DAY_OF_MONTH,newDay);
-        return format.format(calendar.getTime());
-    }
-    //时间字符串转为时间
-    @SneakyThrows
-    public Date getDatetim(String dateString) {
-
-        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        Date date = dateFormat.parse(dateString);
-        return date;
-    }
-    //转换时间为字符串
-    public String setDate(Date date) {
-
-        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        return formatter.format(date);
-    }
-
-    //获取当前日期
-    public String GetDate() {
-        Calendar calendar = Calendar.getInstance(); // get current instance of the calendar
-        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        return formatter.format(calendar.getTime());
-    }
-    //获取当前日期(不带时间)
-    public String GetDateNt() {
-        Calendar calendar = Calendar.getInstance(); // get current instance of the calendar
-        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
-        return formatter.format(calendar.getTime());
-    }
-    //获取当前日期(无格式)
-    public String GetDatewjg() {
-        Calendar calendar = Calendar.getInstance(); // get current instance of the calendar
-        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
-        return formatter.format(calendar.getTime());
-    }
-    @SneakyThrows
-    public  boolean isLegalTime(String startTime, String endTime){
-        Date currentDate = new Date();
-        String format = "HH:mm";
-        SimpleDateFormat sdf = new SimpleDateFormat(format);
-        String nowtTime = sdf.format(currentDate);
-        Date nowDate = sdf.parse(nowtTime);
-        Date startDate = sdf.parse(startTime);
-        Date endDate = sdf.parse(endTime);
-
-        if (nowDate.getTime() == startDate.getTime()
-                || nowDate.getTime() == endDate.getTime()) {
-            return true;
-        }
-
-        Calendar date = Calendar.getInstance();
-        date.setTime(nowDate);
-
-        Calendar begin = Calendar.getInstance();
-        begin.setTime(startDate);
-
-        Calendar end = Calendar.getInstance();
-        end.setTime(endDate);
-
-        if (date.after(begin) && date.before(end)) {
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    //判断日期是否小于当前日期
-    public boolean isPastDate(String str){
-
-        boolean flag = false;
-        Date nowDate = new Date();
-        Date pastDate = null;
-        //格式化日期
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd", Locale.CHINA);
-        //在日期字符串非空时执行
-        if (str != null && !"".equals(str)) {
-            try {
-                //将字符串转为日期格式,如果此处字符串为非合法日期就会抛出异常。
-                pastDate = sdf.parse(str);
-                //调用Date里面的before方法来做判断
-                flag = pastDate.before(nowDate);
-                if (flag) {
-                    System.out.println("该日期早于今日");
-                }else {
-                    System.out.println("该日期晚于今日");
-                }
-            } catch (ParseException e) {
-                e.printStackTrace();
-            }
-        }else {
-            System.out.println("日期参数不可为空");
-        }
-        return flag;
-    }
-
-    /**
-     * 获取指定秒数之后的时间,返回小时和分钟
-     * @param seconds
-     * @return
-     */
-    public String getHourAndMinute(int seconds) {
-        LocalTime now = LocalTime.now(); // 当前时间
-        LocalTime newTime = now.plusSeconds(seconds); // 加上秒数
-        String result = newTime.format(DateTimeFormatter.ofPattern("HH:mm"));
-        return result;
-    }
-}

+ 119 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/CommissionRates.java

@@ -0,0 +1,119 @@
+package com.ruoyi.system.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.annotation.Excel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.GeneratedValue;
+
+/**
+ * 抽成分成对象 commission_rates
+ *
+ * @author ruoyi
+ * @date 2025-12-18
+ */
+@Data
+@TableName(value = "commission_rates")
+@EqualsAndHashCode(callSuper = false)
+public class CommissionRates
+{
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.AUTO)
+    @GeneratedValue
+    /** id */
+    private Long id;
+
+    /** 用户id */
+    @Excel(name = "userId")
+    private Long userId;
+
+    /**开始日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "生效时间")
+    private Date startDate;
+
+    /** 结束日期 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "截止时间")
+    private Date endDate;
+
+    /** 分成比例 */
+    @Excel(name = "分成比例")
+    private String rate;
+
+    /**
+     * 营业额
+     */
+    private Integer turnover;
+
+    /**
+     * 是否已经处理抽成返还
+     */
+    private Boolean handled;
+
+    /**
+     * 处理返还时间
+     */
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date handledTime;
+
+    //删除状态
+    private Boolean deleted;
+
+    private String remark;
+
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+    public void setStartDate(Date startDate)
+    {
+        this.startDate = startDate;
+    }
+
+    public Date getStartDate()
+    {
+        return startDate;
+    }
+    public void setEndDate(Date endDate)
+    {
+        this.endDate = endDate;
+    }
+
+    public Date getEndDate()
+    {
+        return endDate;
+    }
+    public void setRate(String rate)
+    {
+        this.rate = rate;
+    }
+
+    public String getRate()
+    {
+        return rate;
+    }
+
+}

+ 7 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/UserBilling.java

@@ -173,6 +173,13 @@ public class UserBilling
     @TableField(exist = false)
     @TableField(exist = false)
     private String payType;
     private String payType;
 
 
+    @TableField(exist = false)
+    private transient String[] dateRange;
+    @TableField(exist = false)
+    private transient String cretimStart;
+    @TableField(exist = false)
+    private transient String cretimEnd;
+
 
 
     public void setId(Long id)
     public void setId(Long id)
     {
     {

+ 5 - 2
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/BillDTO.java

@@ -4,6 +4,9 @@ import lombok.Data;
 
 
 @Data
 @Data
 public class BillDTO {
 public class BillDTO {
-    private Integer sul;
-    private Integer shouru;
+    private Integer sul; //数量
+    private Integer shouru; //收入
+    private Integer commission; //平台抽成
+    private Integer tax; //平台税务
+    private Integer behalfAmount; //现金扣除总额(骑手使用)
 }
 }

+ 23 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ShBillingDto.java

@@ -0,0 +1,23 @@
+package com.ruoyi.system.domain.vo;
+
+import com.ruoyi.system.domain.UserBilling;
+import lombok.Data;
+
+@Data
+public class ShBillingDto extends UserBilling {
+    /**
+     * 订单金额
+     */
+    private Integer FoodAmount;
+    /**
+     * 商家优惠
+     */
+    private Double shYh;
+    /**
+     * 商户星级
+     */
+    private Double shStarts;
+
+
+
+}

+ 62 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/CommissionRatesMapper.java

@@ -0,0 +1,62 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.domain.CommissionRates;
+
+/**
+ * 抽成分成Mapper接口
+ *
+ * @author ruoyi
+ * @date 2025-12-18
+ */
+public interface CommissionRatesMapper  extends BaseMapper<CommissionRates>
+{
+    /**
+     * 查询抽成分成
+     *
+     * @param id 抽成分成主键
+     * @return 抽成分成
+     */
+    public CommissionRates selectCommissionRatesById(Long id);
+
+    /**
+     * 查询抽成分成列表
+     *
+     * @param commissionRates 抽成分成
+     * @return 抽成分成集合
+     */
+    public List<CommissionRates> selectCommissionRatesList(CommissionRates commissionRates);
+
+    /**
+     * 新增抽成分成
+     *
+     * @param commissionRates 抽成分成
+     * @return 结果
+     */
+    public int insertCommissionRates(CommissionRates commissionRates);
+
+    /**
+     * 修改抽成分成
+     *
+     * @param commissionRates 抽成分成
+     * @return 结果
+     */
+    public int updateCommissionRates(CommissionRates commissionRates);
+
+    /**
+     * 删除抽成分成
+     *
+     * @param id 抽成分成主键
+     * @return 结果
+     */
+    public int deleteCommissionRatesById(Long id);
+
+    /**
+     * 批量删除抽成分成
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteCommissionRatesByIds(Long[] ids);
+}

+ 50 - 21
ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserBillingMapper.java

@@ -1,19 +1,17 @@
 package com.ruoyi.system.mapper;
 package com.ruoyi.system.mapper;
 
 
 import java.util.List;
 import java.util.List;
-import java.util.Map;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.ruoyi.system.domain.PosOrder;
-import com.ruoyi.system.domain.PosReview;
 import com.ruoyi.system.domain.UserBilling;
 import com.ruoyi.system.domain.UserBilling;
 import com.ruoyi.system.domain.vo.BillDTO;
 import com.ruoyi.system.domain.vo.BillDTO;
+import com.ruoyi.system.domain.vo.ShBillingDto;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Select;
 
 
 /**
 /**
  * BillingMapper接口
  * BillingMapper接口
- * 
+ *
  * @author ruoyi
  * @author ruoyi
  * @date 2023-09-06
  * @date 2023-09-06
  */
  */
@@ -32,57 +30,72 @@ public interface UserBillingMapper  extends BaseMapper<UserBilling>
 
 
     //统计商户全部收入
     //统计商户全部收入
     @Select("SELECT IFNULL(SUM(amount),0) FROM user_billing WHERE user_id=#{shid} and type=0 and state=0")  //查询语句
     @Select("SELECT IFNULL(SUM(amount),0) FROM user_billing WHERE user_id=#{shid} and type=0 and state=0")  //查询语句
-    int getshqbsum(@Param("shid") Long shid);  //反回结果
+    int getshAllIncomeSum(@Param("shid") Long shid);  //反回结果
 
 
     //统计商户当天收入
     //统计商户当天收入
     @Select("SELECT IFNULL(SUM(amount),0) FROM user_billing WHERE user_id=#{shid} and type=0 and state=0 and DATE_FORMAT(cretim, '%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d')")  //查询语句
     @Select("SELECT IFNULL(SUM(amount),0) FROM user_billing WHERE user_id=#{shid} and type=0 and state=0 and DATE_FORMAT(cretim, '%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d')")  //查询语句
-    int getshdtsum(@Param("shid") Long shid);  //反回结果
+    int getshDayIncomeSum(@Param("shid") Long shid);  //反回结果
 
 
     //统计商户已提现
     //统计商户已提现
     @Select("SELECT IFNULL(SUM(amount),0) FROM user_billing WHERE user_id=#{shid} and type=2 and state=0")  //查询语句
     @Select("SELECT IFNULL(SUM(amount),0) FROM user_billing WHERE user_id=#{shid} and type=2 and state=0")  //查询语句
     int getshtxsum(@Param("shid") Long shid);  //反回结果
     int getshtxsum(@Param("shid") Long shid);  //反回结果
 
 
     //商家月账单统计
     //商家月账单统计
-    @Select("SELECT IFNULL(COUNT(1),0) AS sul,IFNULL(SUM(amount),0) AS shouru FROM user_billing WHERE type=0 and user_id=#{shid} and DATE_FORMAT(cretim, '%Y-%m') = #{riqi}")  //查询语句
+    @Select("SELECT IFNULL(COUNT(1),0) AS sul,IFNULL(SUM(amount),0) AS shouru ,IFNULL(SUM(divvy),0) AS commission,IFNULL(SUM(tax),0) AS tax,IFNULL(SUM(behalf_amount),0) AS behalfAmount FROM user_billing WHERE type=0 and user_id=#{shid} and DATE_FORMAT(cretim, '%Y-%m') = #{riqi} and state=0")  //查询语句
     BillDTO getmatsum(@Param("shid") Long shid, @Param("riqi") String riqi);  //反回结果
     BillDTO getmatsum(@Param("shid") Long shid, @Param("riqi") String riqi);  //反回结果
-
+    //商户查询周月账单商品总金额,商家优惠总金额
+    @Select("SELECT IFNULL(SUM(o.food_amount),0) AS foodAmount,IFNULL(SUM(o.md_discount_amount),0)+IFNULL(SUM(o.md_sales_reduction),0) as shYh  FROM user_billing b left join pos_order o on b.dd_id=o.dd_id WHERE b.type=0 and b.user_id=#{shid} and DATE_FORMAT(b.cretim, '%Y-%m') = #{riqi} and b.state=0")  //查询语句
+    ShBillingDto getshMonthsum(@Param("shid") Long shid, @Param("riqi") String riqi);
     //商家月账单明细
     //商家月账单明细
-    @Select("SELECT * FROM user_billing WHERE type=0 and user_id=#{shid} and DATE_FORMAT(cretim, '%Y-%m') = #{riqi} ORDER BY id ASC limit #{page},#{size}")  //查询语句
+    @Select("SELECT * FROM user_billing WHERE type=0 and user_id=#{shid} and DATE_FORMAT(cretim, '%Y-%m') = #{riqi}  ORDER BY id desc limit #{page},#{size}")  //查询语句
     List<UserBilling> getmatlist(@Param("shid") Long shid, @Param("riqi") String riqi,@Param("page") Long page,@Param("size") Long size);  //反回结果
     List<UserBilling> getmatlist(@Param("shid") Long shid, @Param("riqi") String riqi,@Param("page") Long page,@Param("size") Long size);  //反回结果
 
 
     //商家周账单统计
     //商家周账单统计
-    @Select("SELECT IFNULL(COUNT(1),0) AS sul,IFNULL(SUM(amount),0) AS shouru FROM user_billing WHERE type=0 and user_id=#{shid} and  WEEK(cretim) = WEEK(#{riqi})")  //查询语句
+    @Select("SELECT IFNULL(COUNT(1),0) AS sul,IFNULL(SUM(amount),0) AS shouru ,IFNULL(SUM(divvy),0) AS commission,IFNULL(SUM(tax),0) AS tax,IFNULL(SUM(behalf_amount),0) AS behalfAmount FROM user_billing WHERE type=0 and user_id=#{shid} and  WEEK(cretim) = WEEK(#{riqi}) and  YEAR(cretim) = YEAR(#{riqi}) and state=0")  //查询语句
     BillDTO getmeeksum(@Param("shid") Long shid, @Param("riqi") String riqi);  //反回结果
     BillDTO getmeeksum(@Param("shid") Long shid, @Param("riqi") String riqi);  //反回结果
-
+    //商户查询周账单商品总金额,商家优惠总金额
+    @Select("SELECT IFNULL(SUM(o.food_amount),0) AS foodAmount,IFNULL(SUM(o.md_discount_amount),0)+IFNULL(SUM(o.md_sales_reduction),0) as shYh  FROM user_billing b left join pos_order o on b.dd_id=o.dd_id WHERE b.type=0 and b.user_id=#{shid} and  WEEK(b.cretim) = WEEK(#{riqi}) and  YEAR(b.cretim) = YEAR(#{riqi}) and b.state=0")  //查询语句
+    ShBillingDto getShMeeksum(@Param("shid") Long shid, @Param("riqi") String riqi);
     //商家周账单明细
     //商家周账单明细
-    @Select("SELECT * FROM user_billing WHERE type=0 and user_id=#{shid} and WEEK(cretim) = WEEK(#{riqi}) ORDER BY id ASC limit #{page},#{size}")  //查询语句
+    @Select("SELECT * FROM user_billing WHERE type=0 and user_id=#{shid} and WEEK(cretim) = WEEK(#{riqi}) and  YEAR(cretim) = YEAR(#{riqi}) ORDER BY id desc limit #{page},#{size}")  //查询语句
     List<UserBilling> getmeeklist(@Param("shid") Long shid, @Param("riqi") String riqi,@Param("page") Long page,@Param("size") Long size);  //反回结果
     List<UserBilling> getmeeklist(@Param("shid") Long shid, @Param("riqi") String riqi,@Param("page") Long page,@Param("size") Long size);  //反回结果
     //商家日账单统计
     //商家日账单统计
-    @Select("SELECT IFNULL(COUNT(1),0) AS sul,IFNULL(SUM(amount),0) AS shouru FROM user_billing WHERE type=0 and user_id=#{shid} and date_format (cretim,'%Y-%m-%d %H:%i:%s') >= date_format (#{riqi}' 00:00:00','%Y-%m-%d %H:%i:%s') and date_format (cretim,'%Y-%m-%d %H:%i:%s') <= date_format (#{riqi}' 23:59:59','%Y-%m-%d %H:%i:%s')")  //查询语句
+    @Select("SELECT IFNULL(COUNT(1),0) AS sul,IFNULL(SUM(amount),0) AS shouru,IFNULL(SUM(divvy),0) AS commission,IFNULL(SUM(tax),0) AS tax,IFNULL(SUM(behalf_amount),0) AS behalfAmount FROM user_billing WHERE type=0 and user_id=#{shid} and date_format (cretim,'%Y-%m-%d %H:%i:%s') >= date_format (CONCAT(#{riqi}, ' 00:00:00'),'%Y-%m-%d %H:%i:%s') and date_format (cretim,'%Y-%m-%d %H:%i:%s') <= date_format (CONCAT(#{riqi}, ' 23:59:59'),'%Y-%m-%d %H:%i:%s') and state=0")  //查询语句
     BillDTO getdaysum(@Param("shid") Long shid, @Param("riqi") String riqi);  //反回结果
     BillDTO getdaysum(@Param("shid") Long shid, @Param("riqi") String riqi);  //反回结果
 
 
+    //商户查询日账单商品总金额,商家优惠总金额
+    @Select("SELECT IFNULL(SUM(o.food_amount),0) AS foodAmount,IFNULL(SUM(o.md_discount_amount),0)+IFNULL(SUM(o.md_sales_reduction),0) as shYh  FROM user_billing b left join pos_order o on b.dd_id=o.dd_id WHERE b.type=0 and b.user_id=#{shid} and date_format (b.cretim,'%Y-%m-%d %H:%i:%s') >= date_format (CONCAT(#{riqi}, ' 00:00:00'),'%Y-%m-%d %H:%i:%s') and date_format (b.cretim,'%Y-%m-%d %H:%i:%s') <= date_format (CONCAT(#{riqi}, ' 23:59:59'),'%Y-%m-%d %H:%i:%s')  ")
+    ShBillingDto getShDaysum(@Param("shid") Long shid, @Param("riqi") String riqi);
     //商家日账单明细
     //商家日账单明细
-    @Select("SELECT * FROM user_billing WHERE type=0 and user_id=#{shid} and date_format (cretim,'%Y-%m-%d %H:%i:%s') >= date_format (#{riqi}' 00:00:00','%Y-%m-%d %H:%i:%s') and date_format (cretim,'%Y-%m-%d %H:%i:%s') <= date_format (#{riqi}' 23:59:59','%Y-%m-%d %H:%i:%s') ORDER BY id ASC limit #{page},#{size}")  //查询语句
+    @Select("SELECT * FROM user_billing WHERE type=0 and user_id=#{shid} and date_format (cretim,'%Y-%m-%d %H:%i:%s') >= date_format (CONCAT(#{riqi}, ' 00:00:00'),'%Y-%m-%d %H:%i:%s') and date_format (cretim,'%Y-%m-%d %H:%i:%s') <= date_format (CONCAT(#{riqi}, ' 23:59:59'),'%Y-%m-%d %H:%i:%s') ORDER BY id desc limit #{page},#{size}")  //查询语句
     List<UserBilling> getdaylist(@Param("shid") Long shid, @Param("riqi") String riqi,@Param("page") Long page,@Param("size") Long size);  //反回结果
     List<UserBilling> getdaylist(@Param("shid") Long shid, @Param("riqi") String riqi,@Param("page") Long page,@Param("size") Long size);  //反回结果
     /**
     /**
      * 查询Billing
      * 查询Billing
-     * 
+     *
      * @param id Billing主键
      * @param id Billing主键
      * @return Billing
      * @return Billing
      */
      */
     public UserBilling selectUserBillingById(Long id);
     public UserBilling selectUserBillingById(Long id);
 
 
     /**
     /**
-     * 查询Billing列表
-     * 
+     * 查询Billing列表,不包含提现记录
+     *
      * @param userBilling Billing
      * @param userBilling Billing
      * @return Billing集合
      * @return Billing集合
      */
      */
     public List<UserBilling> selectUserBillingList(UserBilling userBilling);
     public List<UserBilling> selectUserBillingList(UserBilling userBilling);
 
 
+    /**
+     * 查询提现列表
+     *
+     * @param userBilling Billing
+     * @return Billing集合
+     */
+    public List<UserBilling> selectUserWithdrawList(UserBilling userBilling);
+
     /**
     /**
      * 新增Billing
      * 新增Billing
-     * 
+     *
      * @param userBilling Billing
      * @param userBilling Billing
      * @return 结果
      * @return 结果
      */
      */
@@ -90,7 +103,7 @@ public interface UserBillingMapper  extends BaseMapper<UserBilling>
 
 
     /**
     /**
      * 修改Billing
      * 修改Billing
-     * 
+     *
      * @param userBilling Billing
      * @param userBilling Billing
      * @return 结果
      * @return 结果
      */
      */
@@ -98,7 +111,7 @@ public interface UserBillingMapper  extends BaseMapper<UserBilling>
 
 
     /**
     /**
      * 删除Billing
      * 删除Billing
-     * 
+     *
      * @param id Billing主键
      * @param id Billing主键
      * @return 结果
      * @return 结果
      */
      */
@@ -106,9 +119,25 @@ public interface UserBillingMapper  extends BaseMapper<UserBilling>
 
 
     /**
     /**
      * 批量删除Billing
      * 批量删除Billing
-     * 
+     *
      * @param ids 需要删除的数据主键集合
      * @param ids 需要删除的数据主键集合
      * @return 结果
      * @return 结果
      */
      */
     public int deleteUserBillingByIds(Long[] ids);
     public int deleteUserBillingByIds(Long[] ids);
+
+    /**
+     * 获取用户收入
+     * @param userid
+     * @return
+     */
+    @Select("SELECT IFNULL(SUM(amount),0) FROM user_billing WHERE user_id=#{userid} and type=0 and state=0")  //查询语句
+    public double getUserIncomeSum(Long userid);
+
+    /**
+     * 获取用户提现金额(包括未处理完成)
+     * @param userid
+     * @return
+     */
+    @Select("SELECT IFNULL(SUM(amount),0) FROM user_billing WHERE user_id= #{userid} and type=2 and state>=0")
+    public double getUserWithdrawSum(Long userid);
 }
 }

+ 72 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/ICommissionRatesService.java

@@ -0,0 +1,72 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.domain.CommissionRates;
+
+/**
+ * 抽成分成Service接口
+ *
+ * @author ruoyi
+ * @date 2025-12-18
+ */
+public interface ICommissionRatesService extends IService<CommissionRates>
+{
+    /**
+     * 查询抽成分成
+     *
+     * @param id 抽成分成主键
+     * @return 抽成分成
+     */
+    public CommissionRates selectCommissionRatesById(Long id);
+
+    /**
+     * 查询抽成分成列表
+     *
+     * @param commissionRates 抽成分成
+     * @return 抽成分成集合
+     */
+    public List<CommissionRates> selectCommissionRatesList(CommissionRates commissionRates);
+
+    /**
+     * 新增抽成分成
+     *
+     * @param commissionRates 抽成分成
+     * @return 结果
+     */
+    public int insertCommissionRates(CommissionRates commissionRates);
+
+    /**
+     * 修改抽成分成
+     *
+     * @param commissionRates 抽成分成
+     * @return 结果
+     */
+    public int updateCommissionRates(CommissionRates commissionRates);
+
+    /**
+     * 批量删除抽成分成
+     *
+     * @param ids 需要删除的抽成分成主键集合
+     * @return 结果
+     */
+    public int deleteCommissionRatesByIds(Long[] ids);
+
+    /**
+     * 删除抽成分成信息
+     *
+     * @param id 抽成分成主键
+     * @return 结果
+     */
+    public int deleteCommissionRatesById(Long id);
+
+    /**
+     * 获取商家分成比例
+     * 在数据库层面查询第一条当前日期在有效期内(startDate <= 当前日期 <= endDate)的记录
+     *
+     * @param defaultRate 默认分成比例
+     * @param shUserId 商家用户ID
+     * @return 分成比例
+     */
+    public Double getShCommissionRate(Double defaultRate, Long shUserId);
+}

+ 141 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CommissionRatesServiceImpl.java

@@ -0,0 +1,141 @@
+package com.ruoyi.system.service.impl;
+
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.system.mapper.CommissionRatesMapper;
+import com.ruoyi.system.domain.CommissionRates;
+import com.ruoyi.system.service.ICommissionRatesService;
+import com.ruoyi.common.utils.StringUtils;
+
+/**
+ * 抽成分成Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2025-12-18
+ */
+@Service
+public class CommissionRatesServiceImpl extends ServiceImpl<BaseMapper<CommissionRates>,CommissionRates> implements ICommissionRatesService
+{
+    @Autowired
+    private CommissionRatesMapper commissionRatesMapper;
+
+    /**
+     * 查询抽成分成
+     *
+     * @param id 抽成分成主键
+     * @return 抽成分成
+     */
+    @Override
+    public CommissionRates selectCommissionRatesById(Long id)
+    {
+        return commissionRatesMapper.selectCommissionRatesById(id);
+    }
+
+    /**
+     * 查询抽成分成列表
+     *
+     * @param commissionRates 抽成分成
+     * @return 抽成分成
+     */
+    @Override
+    public List<CommissionRates> selectCommissionRatesList(CommissionRates commissionRates)
+    {
+        return commissionRatesMapper.selectCommissionRatesList(commissionRates);
+    }
+
+    /**
+     * 新增抽成分成
+     *
+     * @param commissionRates 抽成分成
+     * @return 结果
+     */
+    @Override
+    public int insertCommissionRates(CommissionRates commissionRates)
+    {
+        return commissionRatesMapper.insertCommissionRates(commissionRates);
+    }
+
+    /**
+     * 修改抽成分成
+     *
+     * @param commissionRates 抽成分成
+     * @return 结果
+     */
+    @Override
+    public int updateCommissionRates(CommissionRates commissionRates)
+    {
+        return commissionRatesMapper.updateCommissionRates(commissionRates);
+    }
+
+    /**
+     * 批量删除抽成分成
+     *
+     * @param ids 需要删除的抽成分成主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCommissionRatesByIds(Long[] ids)
+    {
+        return commissionRatesMapper.deleteCommissionRatesByIds(ids);
+    }
+
+    /**
+     * 删除抽成分成信息
+     *
+     * @param id 抽成分成主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCommissionRatesById(Long id)
+    {
+        return commissionRatesMapper.deleteCommissionRatesById(id);
+    }
+
+    /**
+     * 获取商家分成比例
+     * 在数据库层面查询第一条当前日期在有效期内(startDate <= 当前日期 <= endDate)的记录
+     *
+     * @param defaultRate 默认分成比例
+     * @param shUserId 商家用户ID
+     * @return 分成比例
+     */
+    @Override
+    public Double getShCommissionRate(Double defaultRate, Long shUserId)
+    {
+        // 获取当前日期(只比较日期部分,忽略时间)
+        // 将 LocalDate 转换为 Date,设置为当天的 00:00:00
+        LocalDate localDate = LocalDate.now();
+        Date currentDate = Date.from(localDate.atStartOfDay()
+                .atZone(java.time.ZoneId.systemDefault())
+                .toInstant());
+
+        // 在数据库层面直接过滤:startDate <= 当前日期 且 endDate >= 当前日期
+        // 使用 LIMIT 1 只查询第一条记录,提高性能
+        CommissionRates matchedRate = this.getOne(
+                new LambdaQueryWrapper<CommissionRates>()
+                        .eq(CommissionRates::getUserId, shUserId)
+                        .eq(CommissionRates::getDeleted,false)
+                        .le(CommissionRates::getStartDate, currentDate)  // startDate <= 当前日期
+                        .ge(CommissionRates::getEndDate, currentDate)     // endDate >= 当前日期
+                        .last("LIMIT 1"),
+                false);  // false 表示如果查询到多条记录不抛异常,只返回第一条
+
+        // 如果找到匹配的记录,解析并返回 rate
+        if (matchedRate != null && StringUtils.isNotEmpty(matchedRate.getRate())) {
+            try {
+                return Double.parseDouble(matchedRate.getRate());
+            } catch (NumberFormatException e) {
+                // 解析失败,返回默认值
+                return defaultRate;
+            }
+        }
+
+        return defaultRate;
+    }
+}

+ 92 - 0
ruoyi-system/src/main/resources/mapper/Billing/CommissionRatesMapper.xml

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.CommissionRatesMapper">
+
+    <resultMap type="CommissionRates" id="CommissionRatesResult">
+        <result property="id"    column="id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="startDate"    column="start_date"    />
+        <result property="endDate"    column="end_date"    />
+        <result property="remark"    column="remark"    />
+        <result property="rate"    column="rate"    />
+        <result property="turnover"    column="turnover"    />
+        <result property="handled"    column="handled"    />
+        <result property="handledTime"    column="handled_time"    />
+        <result property="deleted"    column="deleted"    />
+    </resultMap>
+
+    <sql id="selectCommissionRatesVo">
+        select id, user_id, start_date, end_date, remark, rate, turnover, handled, handled_time, deleted from commission_rates
+    </sql>
+
+    <select id="selectCommissionRatesList" parameterType="CommissionRates" resultMap="CommissionRatesResult">
+        <include refid="selectCommissionRatesVo"/>
+        <where>
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="startDate != null "> and start_date = #{startDate}</if>
+            <if test="endDate != null "> and end_date = #{endDate}</if>
+            <if test="rate != null  and rate != ''"> and rate = #{rate}</if>
+            <if test="deleted != null "> and deleted = #{deleted}</if>
+        </where>
+    </select>
+
+    <select id="selectCommissionRatesById" parameterType="Long" resultMap="CommissionRatesResult">
+        <include refid="selectCommissionRatesVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertCommissionRates" parameterType="CommissionRates" useGeneratedKeys="true" keyProperty="id">
+        insert into commission_rates
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="startDate != null">start_date,</if>
+            <if test="endDate != null">end_date,</if>
+            <if test="remark != null">remark,</if>
+            <if test="rate != null and rate != ''">rate,</if>
+            <if test="turnover != null">turnover,</if>
+            <if test="handled != null">handled,</if>
+            <if test="handledTime != null">handled_time,</if>
+            <if test="deleted != null">deleted,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="startDate != null">#{startDate},</if>
+            <if test="endDate != null">#{endDate},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="rate != null and rate != ''">#{rate},</if>
+            <if test="turnover != null">#{turnover},</if>
+            <if test="handled != null">#{handled},</if>
+            <if test="handledTime != null">#{handledTime},</if>
+            <if test="deleted != null">#{deleted},</if>
+        </trim>
+    </insert>
+
+    <update id="updateCommissionRates" parameterType="CommissionRates">
+        update commission_rates
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="startDate != null">start_date = #{startDate},</if>
+            <if test="endDate != null">end_date = #{endDate},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="rate != null and rate != ''">rate = #{rate},</if>
+            <if test="turnover != null">turnover = #{turnover},</if>
+            <if test="handled != null">handled = #{handled},</if>
+            <if test="handledTime != null">handled_time = #{handledTime},</if>
+            <if test="deleted != null">deleted = #{deleted},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteCommissionRatesById" parameterType="Long">
+        delete from commission_rates where id = #{id}
+    </delete>
+
+    <delete id="deleteCommissionRatesByIds" parameterType="String">
+        delete from commission_rates where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 2 - 0
ruoyi-system/src/main/resources/mapper/Billing/UserBillingMapper.xml

@@ -46,6 +46,8 @@
             <if test="balancePay != null  and balancePay != ''"> and b.balance_pay = #{balancePay}</if>
             <if test="balancePay != null  and balancePay != ''"> and b.balance_pay = #{balancePay}</if>
             <if test="userName != null and userName != ''"> and (u.user_name like concat('%', #{userName}, '%') or u.phone like concat('%', #{userName}, '%'))</if>
             <if test="userName != null and userName != ''"> and (u.user_name like concat('%', #{userName}, '%') or u.phone like concat('%', #{userName}, '%'))</if>
             <if test="userType != null and userType != ''"> and u.user_type = #{userType}</if>
             <if test="userType != null and userType != ''"> and u.user_type = #{userType}</if>
+            <if test="cretimStart != null and cretimStart != ''"> and b.cretim &gt;= #{cretimStart}</if>
+            <if test="cretimEnd != null and cretimEnd != ''"> and b.cretim &lt;= #{cretimEnd}</if>
         </where>
         </where>
         order by id desc
         order by id desc
     </select>
     </select>