小飞侠
2025-12-01 7eca0ab1b6d5142d623efd471985b2a20b559616
修正审批备注长度
7个文件已修改
690 ■■■■■ 已修改文件
AdminwebPages/adminpageView/src/Api/apis.ts 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
AdminwebPages/adminpageView/src/views/cylsgPayrollReport.vue 419 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/CyOS/CyOSBaoXiaoCaiWuController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/CyOS/CyOSBaoXiaoZHuGuanController.cs 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Application/Transfer/UserTransfer.cs 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Model/ECTEModel/OaWorkPlanShenpi.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cylsg/cylsg.Web.Entry/appsettings.json 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
AdminwebPages/adminpageView/src/Api/apis.ts
@@ -1,220 +1,264 @@
import type { EzResult } from './EzApiBaseTypes'
import axios from 'axios'
import type { EzResult } from "./EzApiBaseTypes";
import axios from "axios";
  /** 获取DFlFunInfo列表 */
  export const GetTransferOrder=(data:Request) => {
    return axios.post<EzResult<RetPageDataWeChatTransferOrder>>("https://yocaisim.51zhengcai.com/api/UserTransfer/GetTransferOrder", data);
  };
const PYTestr = 'https://yocaisim.51zhengcai.com' //'http://localhost:5000'
// const PYTestr = 'http://localhost:5000'
/** 获取DFlFunInfo列表 */
export const GetTransferOrder = (data: SearchRequest) => {
  return axios.post<EzResult<RetPageDataWeChatTransferOrder>>(
    `${PYTestr}/api/UserTransfer/GetTransferOrder`,
    data,
  )
}
//http://127.0.0.1:4523/m1/5212733-4879059-default/api/UserTransfer/GetTransferOder
export const GetTransferOderOfMain = (data: SearchRequestOfMian) => {
  return axios.post<EzResult<RetPageDataWeChatTransferOrder>>(
    `${PYTestr}/api/UserTransfer/GetTransferOder`,
    data,
  )
}
///api/UserTransfer/ReSendCreadTransferMoney 重新支付
export const ReSendCreadTransferMoney = (id: number) => {
  return axios.get<EzResult<boolean>>(
    `${PYTestr}/api/UserTransfer/ReSendCreadTransferMoney?id=${id}`,
  )
}
/**
 * SSPageByWhereOrder,根据where查询条件和order排序获取列表
 */
export interface Request {
  order?: SSOrder;
  page?: PageModel;
export interface SearchRequest {
  order?: SSOrder
  page?: PageModel
  /**
   * 判断条件 必须是json格式的字符串{xxx:ddd}
   */
  where?: object | string;
  where?: object | string
}
/**
* SSOrder,排序方式
*/
 * SearchTransferOder
 */
export interface SearchRequestOfMian {
  /**
   * 搜索状态值  模糊查询
   */
  batchStatus?: null | string
  /**
   * 是否已经成功发起了
   */
  hasSendOk?: boolean
  /**
   * 是否特殊处理比如支付失败后已经处理为其他情况
   */
  isSetOK?: boolean | null
  /**
   * 排除搜索值状态 要排除的状态值必须是全称,多个之间用 “|”间隔
   */
  noTBatchStatus?: null | string
  /**
   * 当前页码
   */
  pageIndex?: number
  /**
   * 页面大小
   */
  pageSize?: number
}
/**
 * SSOrder,排序方式
 */
export interface SSOrder {
  des?: OrderByType;
  des?: OrderByType
  /**
   * 属性名称
   */
  name?: null | string;
  name?: null | string
}
/**
* OrderByType
*/
 * OrderByType
 */
export enum OrderByType {
  Asc = "Asc",
  Desc = "Desc",
  Asc = 'Asc',
  Desc = 'Desc',
}
/**
* PageModel
*/
 * PageModel
 */
export interface PageModel {
  pageIndex?: number;
  pageSize?: number;
  totalCount?: number;
  pageIndex?: number
  pageSize?: number
  totalCount?: number
}
/**
* RetPageData_WeChatTransferOrder,通用返回参数
*/
 * RetPageData_WeChatTransferOrder,通用返回参数
 */
export interface RetPageDataWeChatTransferOrder {
  /**
   * 数据
   */
  data?: WeChatTransferOrder[] | null;
  page?: PageModel;
  data?: WeChatTransferOrder[] | null
  listdata?: WeChatTransferOrder | null
  page?: PageModel
}
/**
* WeChatTransferOrder,转账单账模型
*/
 * WeChatTransferOrder,转账单账模型
 */
export interface WeChatTransferOrder {
  /**
   * 重新支付订单列表
   */
  agWeChatTransferOrders?: WeChatTransferOrder[] | null;
  agWeChatTransferOrders?: WeChatTransferOrder[] | null
  /**
   * 获取或设置微信批次单号。
   */
  batchId?: null | string;
  batchId?: null | string
  /**
   * 获取或设置批次的名称。
   * 示例: "2019年1月深圳分部报销单"
   */
  batchName?: null | string;
  batchName?: null | string
  /**
   * 获取或设置批次的备注。
   * 示例: "2019年1月深圳分部报销单"
   */
  batchRemark?: null | string;
  batchRemark?: null | string
  /**
   * 获取或设置批次状态。
   */
  batchStatus?: null | string;
  batchStatus?: null | string
  /**
   * 获取或设置关闭批次的原因。
   * 示例: "OVERDUE_CLOSE"
   */
  closeReason?: null | string;
  closeReason?: null | string
  /**
   * 创建人
   */
  createBy?: null | string;
  createBy?: null | string
  /**
   * 创建时间
   */
  createTime?: Date | null;
  createTime?: string | null
  /**
   * 错误标识
   */
  errorCode?: null | string;
  errorCode?: null | string
  /**
   * 错误消息
   */
  errorMsg?: null | string;
  errorMsg?: null | string
  /**
   * 获取或设置批次中的失败总金额。
   * 示例: 100000
   */
  failAmount?: number | null;
  failAmount?: number | null
  /**
   * 获取或设置批次中的失败项目数。
   * 示例: 1
   */
  failNum?: number | null;
  failNum?: number | null
  /**
   * ID
   */
  id?: number;
  id?: number
  /**
   * 是否删除
   */
  isDeleted?: boolean;
  isDeleted?: boolean
  /**
   * 是否有效
   */
  isEn?: boolean;
  isEn?: boolean
  /**
   * 是否已经完成处理  默认未处理
   */
  isSetOK?: boolean;
  isSetOK?: boolean | null
  /**
   * 获取或设置商户批次单号。
   */
  outBatchNumber?: null | string;
  outBatchNumber?: null | string
  /**
   * 标注
   */
  remake?: null | string;
  remake?: null | string
  /**
   * 再次发起时 的描述
   */
  remakeDes?: null | string;
  remakeDes?: null | string
  /**
   * 排序
   */
  sort?: number | null;
  sort?: number | null
  /**
   * 获取或设置批次中的成功总金额。
   * 示例: 3900000
   */
  successAmount?: number | null;
  successAmount?: number | null
  /**
   * 获取或设置批次中的成功项目数。
   * 示例: 199
   */
  successNum?: number | null;
  successNum?: number | null
  /**
   * 租户
   */
  tenantID?: number | null;
  tenantID?: number | null
  /**
   * 获取或设置批次中的总金额。
   * 示例: 4000000
   */
  totalAmount?: number | null;
  totalAmount?: number | null
  /**
   * 获取或设置批次中的项目总数。
   * 示例: 200
   */
  totalNum?: number | null;
  totalNum?: number | null
  /**
   * 获取或设置转账场景标识符。
   * 示例: "1000"
   */
  transferSceneId?: null | string;
  transferSceneId?: null | string
  /**
   * 修改人
   */
  upDataBy?: null | string;
  upDataBy?: null | string
  /**时间筛选数组 */
  DataTime?:Date[]|string;
  DataTime?: Date[] | string
  createDataTime?: Date[] | string
  /**
   * 修改时间
   */
  upDataTime?: string | null;
  upDataTime?: string | null
  /**
   * 用户ID。
   */
  userID?: number;
  userID?: number
  /**
   * 用户身份证
   */
  userIDCode?: null | string;
  userIDCode?: null | string
  /**
   * 名字
   */
  userName?: null | string;
  userName?: null | string
  /**
   * 是否重新发起支付,当支付失败后,超出重新的支付单失败后,需要重新更换单号重新发起新的支付请求,重新发起支付请求单
   */
  weChatTransferOrderPrId?: number | null;
  weChatTransferOrderPrId?: number | null
  YiTiXianGz?:number
  YiTiXianGz?: number
   ZhongGz?:number
   itCode?:string|null
  ZhongGz?: number
  itCode?: string | null
  /**
   * 是否已经发送成功
   */
  hasSendOk?: boolean | null
}
AdminwebPages/adminpageView/src/views/cylsgPayrollReport.vue
@@ -3,7 +3,7 @@
 * @Author: 小飞侠
 * @Date: 2025-03-17 09:45:10
 * @LastEditors: Please set LastEditors
 * @LastEditTime: 2025-03-27 13:24:58
 * @LastEditTime: 2025-10-24 17:12:56
 * Copyright: 2025  MinTinge CO.,LTD. All Rights Reserved.
 * @Descripttion: 写入你的描述
-->
@@ -18,64 +18,74 @@
-->
<!-- -->
<template>
  <div style="max-width: 1440px; margin: 0 auto">
  <div style=" margin: 0 auto">
    <el-card>
      <PlusForm v-model="formdata" :columns="FromColumns" :row-props="{ gutter: 100 }" :col-props="{
        span: 5
        span: 5,
      }" @submit="mysubmit">
        <template #footer="{ handleSubmit }">
          <div style="margin: 0 auto">
            <el-button type="primary" @click="handleSubmit">搜索</el-button>
            <el-button type="error" @click="RePayFun" :disabled="!canRePay">重新支付</el-button>
          </div>
        </template>
      </PlusForm>
    </el-card>
    <PlusTable ref="plusTableInstance" :columns="tableConfig" :table-data="tableData" table-title="表格" show-summary
      :summary-method="getSummaries" :pagination="{ total, modelValue: pageInfo }"
      @paginationChange="handlePaginationChange" adaptive />
      :summary-method="getSummaries"
      :pagination="{ total, modelValue: pageInfo, pageSizeList: [30, 40, 50, 100, 200, 300, 400, 500] }"
      @paginationChange="handlePaginationChange" adaptive :is-selection="true" has-index-column
      @selection-change="handleSelectionChange" row-key="id" />
  </div>
</template>
<script setup lang='tsx'>
import { GetTransferOrder, OrderByType, type WeChatTransferOrder } from '@/Api/apis';
import moment from 'moment';
import type { PlusColumn, PlusTableInstance, PageInfo } from 'plus-pro-components'
<script setup lang="tsx">
import {
  GetTransferOderOfMain,
  GetTransferOrder,
  OrderByType,
  ReSendCreadTransferMoney,
  type WeChatTransferOrder,
} from '@/Api/apis'
import { ElMessage } from 'element-plus'
import moment from 'moment'
import type { PageInfo, PlusColumn } from 'plus-pro-components'
import { useTable } from 'plus-pro-components'
import { h, onMounted, ref, type VNode } from 'vue'
import { computed, h, onMounted, ref, watch, type VNode } from 'vue'
const formdata = ref<WeChatTransferOrder>({
  userName: null,
  userIDCode: null,
  DataTime: [],
  itCode: null
  itCode: null,
  isSetOK: null,
  hasSendOk: null,
  createDataTime: [],
})
const multipleSelection = ref<WeChatTransferOrder[]>([])
const FromColumns: PlusColumn[] = [
  {
    label: '姓名',
    prop: 'userName',
    labelWidth: 60,
  },
  {
    label: '身份证号码',
    labelWidth: 100,
    prop: 'userIDCode'
  }
  ,
    prop: 'userIDCode',
  },
  {
    label: '电话号码',
    labelWidth: 100,
    prop: 'itCode'
    prop: 'itCode',
  },
  {
    label: '支付时间',
    label: '更新时间',
    labelWidth: 100,
    width: 400,
    colProps: {
      span: 8
      span: 8,
    },
    prop: 'DataTime',
    valueType: 'date-picker',
@@ -85,195 +95,279 @@
      endPlaceholder: '请选择结束时间',
      rangeSeparator: '-',
      valueFormat: 'YYYY-MM-DDTHH:mm:ss',
    },
  }
  },
  {
    label: '创建时间',
    labelWidth: 100,
    width: 400,
    colProps: {
      span: 8,
    },
    prop: 'createDataTime',
    valueType: 'date-picker',
    fieldProps: {
      type: 'datetimerange',
      startPlaceholder: '请选择开始时间',
      endPlaceholder: '请选择结束时间',
      rangeSeparator: '-',
      valueFormat: 'YYYY-MM-DDTHH:mm:ss',
    },
  },
  {
    label: '支付失败',
    labelWidth: 100,
    prop: 'hasSendOk',
    valueType: 'switch',
  },
]
const tableConfig = ref<PlusColumn[]>(
  [
    {
      label: '姓名',
      prop: 'userName',
      width: 80
const canRePay = computed(() => {
  // 必须有选中项,且所有选中项的hasSendOk都为true(支付失败)
  return multipleSelection.value.length > 0 &&
    formdata.value.hasSendOk == true
})
const tableConfig = ref<PlusColumn[]>([
  {
    label: '姓名',
    prop: 'userName',
    width: 70,
  },
  {
    label: '身份证',
    prop: 'userIDCode',
    width: 162,
  },
  {
    label: '电话号码',
    prop: 'itCode',
    width: 110,
  },
  {
    width: 100,
    label: '总额度',
    prop: 'totalAmount',
    render: (value) => {
      let formattedAmount = ((value ?? 0) / 100).toLocaleString('zh-CN', {
        style: 'currency',
        currency: 'CNY',
      })
      return <span>{formattedAmount}元 </span>
    },
    {
      label: '身份证',
      prop: 'userIDCode',
      width: 170
  },
  {
    width: 100,
    label: '成功额度',
    prop: 'successAmount',
    sortable: true,
    render: (value) => {
      let formattedAmount = ((value ?? 0) / 100).toLocaleString('zh-CN', {
        style: 'currency',
        currency: 'CNY',
      })
      return <span>{formattedAmount}元 </span>
    },
    {
      label: '电话号码',
      prop: 'itCode',
      width: 120
  },
  {
    width: 100,
    label: '失败额度',
    prop: 'failAmount',
    sortable: true,
    render: (value) => {
      let formattedAmount = ((value ?? 0) / 100).toLocaleString('zh-CN', {
        style: 'currency',
        currency: 'CNY',
      })
      return <span>{formattedAmount}元 </span>
    },
  },
    {
      width: 100,
      label: '总额度',
      prop: 'totalAmount',
      render: (value) => {
        let formattedAmount = ((value ?? 0) / 100).toLocaleString('zh-CN', { style: 'currency', currency: 'CNY' });
        return <span>{formattedAmount}元</span>
      }
  {
    width: 160,
    label: '更新时间',
    prop: 'upDataTime',
    render: (value) => {
      return <span>{moment(value).format('YYYY-MM-DD HH:mm:ss')} </span>
    },
    {
      width: 100,
      label: '成功额度',
      prop: 'successAmount',
      sortable: true,
      render: (value) => {
        let formattedAmount = ((value ?? 0) / 100).toLocaleString('zh-CN', { style: 'currency', currency: 'CNY' });
        return <span>{formattedAmount}元</span>
      }
  },
  {
    width: 160,
    label: '创建时间',
    prop: 'createTime',
    render: (value) => {
      return <span>{moment(value).format('YYYY-MM-DD HH:mm:ss')} </span>
    },
    {
      width: 100,
      label: '失败额度',
      prop: 'failAmount',
      sortable: true,
      render: (value) => {
  },
        let formattedAmount = ((value ?? 0) / 100).toLocaleString('zh-CN', { style: 'currency', currency: 'CNY' });
        return <span>{formattedAmount}元</span>
      }
  {
    width: 80,
    label: '补发单',
    prop: 'weChatTransferOrderPrId',
    render: (value) => {
      const color = value > 0 ? 'red' : 'green';
      return <span style={{ color }}>{value ? `是${value}` : '否'} </span>
    },
  },
  {
    label: '腾讯单号',
    prop: 'batchId',
  },
  {
    label: '客户单号',
    prop: 'outBatchNumber',
  },
  {
    width: 160,
    label: '总工资',
    prop: 'zhongGz',
    render: (value) => {
      let formattedAmount = (value ?? 0).toLocaleString('zh-CN', {
        style: 'currency',
        currency: 'CNY',
      })
    {
      width: 180,
      label: '提现时间',
      prop: 'upDataTime',
      render: (value) => {
        return <span>{moment(value).format('YYYY-MM-DD HH:mm:ss')}</span>
      }
      return <span>{formattedAmount}元 </span>
    },
    {
  },
  {
    width: 160,
    label: '已提工资',
    prop: 'yiTiXianGz',
    render: (value) => {
      let formattedAmount = (value ?? 0).toLocaleString('zh-CN', {
        style: 'currency',
        currency: 'CNY',
      })
      label: '腾讯单号',
      prop: 'batchId'
      return <span>{formattedAmount}元 </span>
    },
    {
      label: '客户单号',
      prop: 'outBatchNumber'
    },
    {
      width: 100,
      label: '总工资',
      prop: 'zhongGz',
      render: (value) => {
        let formattedAmount = ((value ?? 0)).toLocaleString('zh-CN', { style: 'currency', currency: 'CNY' });
        return <span>{formattedAmount}元</span>
      }
    },
    {
      width: 100,
      label: '已提工资',
      prop: 'yiTiXianGz',
      render: (value) => {
        let formattedAmount = ((value ?? 0)).toLocaleString('zh-CN', { style: 'currency', currency: 'CNY' });
        return <span>{formattedAmount}元</span>
      }
    }
  ]
);
  },
])
const handleSelectionChange = (val: WeChatTransferOrder[]) => {
  multipleSelection.value = val
}
const { tableData, pageInfo, total, loadingStatus } = useTable<WeChatTransferOrder[]>()
pageInfo.value.page = 1;
pageInfo.value.pageSize = 40;
onMounted(() => {
  getList();
  getList()
})
const getList = async () => {
  loadingStatus.value = true
  if (formdata.value.DataTime && Array.isArray(formdata.value.DataTime) && formdata.value.DataTime.length === 2) {
    debugger
    formdata.value.upDataTime = `${formdata.value.DataTime[0]}~${formdata.value.DataTime[1].toString()}`;
  } else {
  if (
    formdata.value.DataTime &&
    Array.isArray(formdata.value.DataTime) &&
    formdata.value.DataTime.length === 2
  ) {
    formdata.value.upDataTime = `${formdata.value.DataTime[0]}~${formdata.value.DataTime[1].toString()}`
  } else {
  }
  if (
    formdata.value.createDataTime &&
    Array.isArray(formdata.value.createDataTime) &&
    formdata.value.createDataTime.length === 2
  ) {
    formdata.value.createTime = `${formdata.value.createDataTime[0]}~${formdata.value.createDataTime[1].toString()}`
  } else {
  }
  if (formdata.value.hasSendOk == true) {
    // 支付失败的表
    GetTransferOderOfMain({
      pageIndex: pageInfo.value.page,
      pageSize: pageInfo.value.pageSize,
      hasSendOk: false,
      isSetOK: false
    })
      .then((res) => {
        if (res.data.code == 1) {
          tableData.value = (res.data?.data?.listdata ?? []) as WeChatTransferOrder[]
          total.value = res.data.data?.page?.totalCount as number
        }
      })
      .finally(() => {
        loadingStatus.value = false
      })
    return
  }
  GetTransferOrder({
    page: { pageIndex: pageInfo.value.page, pageSize: pageInfo.value.pageSize },
     where: JSON.stringify(formdata.value),
     order:{
       name:"upDataTime",
       des:OrderByType.Desc
     }
  }).then((res) => {
    if (res.data.code == 1) {
      tableData.value = res.data.data?.data as WeChatTransferOrder[];
      total.value = res.data.data?.page?.totalCount as number;
    }
  }).finally(() => {
    loadingStatus.value = false
    where: JSON.stringify(formdata.value),
    order: {
      name: 'upDataTime',
      des: OrderByType.Desc,
    },
  })
    .then((res) => {
      if (res.data.code == 1) {
        tableData.value = res.data.data?.data as WeChatTransferOrder[]
        total.value = res.data.data?.page?.totalCount as number
      }
    })
    .finally(() => {
      loadingStatus.value = false
    })
}
const RePayFun = async () => {
  if (multipleSelection.value.length == 0) {
    ElMessage.error('请选择要重新支付的记录')
    return
  }
  let ids = multipleSelection.value.map((x) => x.id)
  for (let index = 0; index < ids.length; index++) {
    const element = ids[index]
    await ReSendCreadTransferMoney(element as number)
  }
  ElMessage.success('支付完毕刷新列表')
  loadingStatus.value = false
}
const mysubmit = () => {
  getList();
  getList()
}
const getSummaries = (param: any) => {
  const { columns, data } = param
  const sums: (string | VNode)[] = []
  columns.forEach((column: { property: string | number; }, index: number) => {
  columns.forEach((column: { property: string | number }, index: number) => {
    if (index === 0) {
      sums[index] = h('div', { style: { textDecoration: 'underline' } }, [
        '统计',
      ])
      sums[index] = h('div', { style: { textDecoration: 'underline' } }, ['统计'])
      return
    }
    if (column.property == "totalAmount") {
      const values = data.map((x:any) => x.totalAmount);
      let formattedAmount = (values.reduce((prev: any, cur: any) => prev + cur) / 100).toLocaleString('zh-CN', { style: 'currency', currency: 'CNY' });
    if (column.property == 'totalAmount') {
      const values = data.map((x: any) => x.totalAmount ?? 0)
      let formattedAmount = (
        values.reduce((prev: any, cur: any) => prev + cur) / 100
      ).toLocaleString('zh-CN', { style: 'currency', currency: 'CNY' })
      sums[index] = formattedAmount
      return
    }
    if (column.property == "successAmount") {
      const values = data.map((x: { successAmount: any; }) => x.successAmount);
      let formattedAmount = (values.reduce((prev: any, cur: any) => prev + cur) / 100).toLocaleString('zh-CN', { style: 'currency', currency: 'CNY' });
    if (column.property == 'successAmount') {
      const values = data.map((x: { successAmount: any }) => x.successAmount ?? 0)
      let formattedAmount = (
        values.reduce((prev: any, cur: any) => prev + cur) / 100
      ).toLocaleString('zh-CN', { style: 'currency', currency: 'CNY' })
      sums[index] = formattedAmount
      return
    }
    if (column.property == "failAmount") {
      const values = data.map((x: { failAmount: any; }) => x.failAmount);
      let formattedAmount = (values.reduce((prev: any, cur: any) => prev + cur) / 100).toLocaleString('zh-CN', { style: 'currency', currency: 'CNY' });
    if (column.property == 'failAmount') {
      const values = data.map((x: { failAmount: any }) => x.failAmount ?? 0)
      let formattedAmount = (
        values.reduce((prev: any, cur: any) => prev + cur) / 100
      ).toLocaleString('zh-CN', { style: 'currency', currency: 'CNY' })
      sums[index] = formattedAmount
      return
    }
  })
  return sums
}
@@ -281,6 +375,5 @@
  pageInfo.value = _pageInfo
  getList()
}
</script>
<style lang='scss' scoped></style>
<style lang="scss" scoped></style>
cylsg/cylsg.Application/CyOS/CyOSBaoXiaoCaiWuController.cs
@@ -173,7 +173,7 @@
                            AccountId = FirmAccount.Keyid,
                            Money = data.PlanMoney ?? 0,
                            LastUpdateTime = DateTime.Now,
                            Department = data.PlanContent,
                            Department = data?.Depart?.Name??"",
                            RecordTypeId = 2,
                            SubjectId = 3,//报销必须为3
                            Operator = Permissions.Name,
cylsg/cylsg.Application/CyOS/CyOSBaoXiaoZHuGuanController.cs
@@ -68,8 +68,9 @@
            SearchList = SearchList.And(x => x.MemberId == _OAServices.firmId);
            SearchList = SearchList.And(x => x.PlanType == 3);
            SearchList = SearchList.And(x => x.PlanDataType == 17);
            //SearchList = SearchList.And(x =>  x.ApprovalStatus == PlanStatusType.unApproval);
            //SearchList = SearchList.And(x =>  x.OaWorkPlanShenpis.Where(y => y.Buzhou == 1 && y.ApprovalStaffId == Permissions.MemberId).Count()<=0);
            SearchList = SearchList.And(x => x.OaWorkPlanShenpis.Count(y => y.Buzhou == 1&& y.ApprovalStaffId != Permissions.MemberId) < 2);//只需要两个人审批 另外两个人审批了,不在显示
            //SearchList = SearchList.And(x => x.ApprovalStatus == PlanStatusType.unApproval);
            //SearchList = SearchList.And(x => x.OaWorkPlanShenpis.Where(y => y.Buzhou == 1 && y.ApprovalStaffId == Permissions.MemberId).Count() <= 0);
            //SearchList = SearchList.And(x => x.DepartId == Permissions.DepartId); 部门筛选
            if (!string.IsNullOrEmpty(param.StaffName))
            {
@@ -116,7 +117,7 @@
            //强制增加员工过滤
   
            var data = await _SugarClient.Queryable<OaWorkPlan>().Includes(x=>x.Depart)
                    .Includes(x=>x.OaWorkPlanShenpis.Where(y=>y.ApprovalStaffId==Permissions.MemberId&&y.Buzhou==1).ToList())
                    .Includes(x=>x.OaWorkPlanShenpis.Where(y=>y.Buzhou==1).ToList())
                    .Where(SearchList).OrderByDescending(x => x.PlanStartTime).Mapper(
                    x =>
                    {
@@ -196,6 +197,13 @@
            {
                throw Oops.Oh("报销单未提交不可审批");
            }
            int shenpiCount = data.OaWorkPlanShenpis.Where(x => x.ApprovalStaffId != Permissions.MemberId && x.Buzhou == 1).Count();
            if(shenpiCount >= 2)
            {
                //两个人审批后。不可再审批
                throw Oops.Oh("已经已经结束");
            }
            OaWorkPlanShenpi shenpi = data.OaWorkPlanShenpis.Where(x => x.ApprovalStaffId == Permissions.MemberId&&x.Buzhou==1).FirstOrDefault();
             if (shenpi!=null)
            {
cylsg/cylsg.Application/Transfer/UserTransfer.cs
@@ -258,7 +258,7 @@
        /// </summary>
        [AllowAnonymous]
        [HttpPost]
        [ApiExplorerSettings(IgnoreApi = true)]
        [ApiExplorerSettings(IgnoreApi = true)]
        public async Task<TransferOderOut> GetTransferOder(SearchTransferOder param)
        {
@@ -291,9 +291,14 @@
            else
                //有一笔大余0 的视为失败
                SearchList= SearchList.And(x => x.FailNum ==0&&x.BatchStatus=="FINISHED");
             var data=await WeChatTransferOrderwork.AsQueryable().Where(SearchList).Select(x=>new WeChatTransferOrder
             var data=await WeChatTransferOrderwork.AsQueryable().Includes(x => x.user, u => u.Worek).Where(SearchList).Select(x=>new WeChatTransferOrder
             {
               BatchRemark= SqlFunc.Subqueryable<UserWorker>().Where(uw=>uw.UserId==x.UserID).Select(uw => uw.name+ uw.IdCode)
                 UserName=x.user.Worek.name,
                 UserIDCode = x.user.Worek.IdCode,
                 ItCode = x.user.ItCode,
                 YiTiXianGz = x.user.Worek.YiTiXianJine,
                 ZhongGz = x.user.Worek.TiXianZonge,
                 BatchRemark = SqlFunc.Subqueryable<UserWorker>().Where(uw=>uw.UserId==x.UserID).Select(uw => uw.name+ uw.IdCode)
             },true).ToPageListAsync(pageModel.PageIndex, pageModel.PageSize,pageModel.TotalCount);
            //var data = await WeChatTransferOrderwork.GetPageListAsync(SearchList, pageModel);
              
@@ -913,32 +918,34 @@
            }
            RefAsync<int> title = 0;
            var BR = new BaseRepository<WeChatTransferOrder>();
          var data=  await BR.AsQueryable().Includes(x=>x.user,u=>u.Worek).Select(x=>new WeChatTransferOrder
          {
               UserIDCode= x.user.Worek.IdCode,
                UserName=x.user.Worek.name,
                 TotalAmount=x.TotalAmount,
               TotalNum=x.TotalNum,
              BatchId=x.BatchId,
               SuccessNum=x.SuccessNum,
              OutBatchNumber=x.OutBatchNumber,
              BatchName = x.BatchName,
              BatchStatus=x.BatchStatus,
              UserID= x.UserID,
              UpDataTime=x.UpDataTime,
              YiTiXianGz=x.user.Worek.YiTiXianJine,
               ZhongGz=x.user.Worek.TiXianZonge,
              ItCode=x.user.ItCode,
              SuccessAmount= x.SuccessAmount,
              FailAmount=x.FailAmount
            var data = await BR.AsQueryable().Includes(x => x.user, u => u.Worek).Select(x => new WeChatTransferOrder
            {
                Id = 0,
                 UserIDCode = x.user.Worek.IdCode,
                UserName = x.user.Worek.name,
                TotalAmount = x.TotalAmount,
                TotalNum = x.TotalNum,
                BatchId = x.BatchId,
                SuccessNum = x.SuccessNum,
                OutBatchNumber = x.OutBatchNumber,
                BatchName = x.BatchName,
                BatchStatus = x.BatchStatus,
                UserID = x.UserID,
                UpDataTime = x.UpDataTime,
                YiTiXianGz = x.user.Worek.YiTiXianJine,
                ZhongGz = x.user.Worek.TiXianZonge,
                ItCode = x.user.ItCode,
                SuccessAmount = x.SuccessAmount,
                FailAmount = x.FailAmount,
                CreateTime = x.CreateTime
          }).MergeTable().WhereIF(where != null, where).OrderByIF(order!=null,order,Param.Order?.Des?? OrderByType.Asc).ToPageListAsync(Param.Page.PageIndex,Param.Page.PageSize, title);
            },true).MergeTable().WhereIF(where != null, where).OrderByIF(order!=null,order,Param.Order?.Des?? OrderByType.Asc).ToPageListAsync(Param.Page.PageIndex,Param.Page.PageSize, title);
         
cylsg/cylsg.Model/ECTEModel/OaWorkPlanShenpi.cs
@@ -74,7 +74,7 @@
            public string Operator { get; set; }
            /// <summary>
            /// 审批步骤
            /// 审批步骤 1 是主管审批,2是经理审批
            /// </summary>
            [SugarColumn(ColumnName = "Buzhou")]
            public int? Buzhou { get; set; }
cylsg/cylsg.Web.Entry/appsettings.json
@@ -24,7 +24,7 @@
      // "ConnectionString": "Server=192.168.0.31;Database=CyLsgDb; MultipleActiveResultSets=true;pooling=true;min pool size=5;max pool size=32767;connect timeout=20;Encrypt=True;TrustServerCertificate=True;integrated security=True;",
      "ConnectionString": "Server=192.168.18.15;Database=CyLsgDb; MultipleActiveResultSets=true;pooling=true;min pool size=5;max pool size=32767;connect timeout=20;Encrypt=True;TrustServerCertificate=True;User Id=SA;Password=123456;",
      "ConnectionString": "Server=192.168.18.5;Database=CyLsgDb; MultipleActiveResultSets=true;pooling=true;min pool size=5;max pool size=32767;connect timeout=20;Encrypt=True;TrustServerCertificate=True;User Id=SA;Password=123456;",
      "DbType": "SqlServer", // "SqlServer" ,mysql,
      "IsAutoCloseConnection": true
    }
@@ -36,7 +36,7 @@
      //"IsAutoCloseConnection": true
      "ConnectionString": "Server=192.168.18.15;Database=ECTEST_NEW; MultipleActiveResultSets=true;pooling=true;min pool size=5;max pool size=32767;connect timeout=20;Encrypt=True;TrustServerCertificate=True;User Id=SA;Password=123456;",
      "ConnectionString": "Server=192.168.18.5;Database=ECTEST_NEW; MultipleActiveResultSets=true;pooling=true;min pool size=5;max pool size=32767;connect timeout=20;Encrypt=True;TrustServerCertificate=True;User Id=SA;Password=123456;",
      // "ConnectionString": "Server=118.123.213.60;Database=ECTEST_NEW; MultipleActiveResultSets=true;pooling=true;min pool size=5;max pool size=32767;connect timeout=20;Encrypt=True;TrustServerCertificate=True;User Id=SA;Password=123qwe!@#;",
      "DbType": "SqlServer", // "SqlServer" ,mysql,
      "IsAutoCloseConnection": true,
@@ -60,9 +60,9 @@
    "ValidateAudience": true, // 是否验证签收方,bool 类型,默认true
    "ValidAudience": "www.51zhengcai.com", // 签收方,string 类型
    "ValidateLifetime": true, // 是否验证过期时间,bool 类型,默认true,建议true
    "ExpiredTime": 14400, // 过期时间,long 类型,单位分钟,默认20分钟
    "ExpiredTime": 10, // 过期时间,long 类型,单位分钟,默认20分钟
    "ClockSkew": 5, // 过期时间容错值,long 类型,单位秒,默认 5秒
    "Algorithm": "HS256", // 加密算法,string 类型,默认 HS256
    "RefreshTokenExpires": 14400 //分钟 1天 1440分钟
    "RefreshTokenExpires": 1 //分钟 1天 1440分钟
  }
}