Compare commits

...

4 Commits

Author SHA1 Message Date
qsh
a9c5d16926 上传 2024-07-16 16:49:01 +08:00
qsh
f3b5079fbe 上传 2024-07-16 11:56:37 +08:00
qsh
880eabb761 上传 2024-07-16 11:54:40 +08:00
qsh
77134be7ff 上传 2024-07-16 11:53:13 +08:00
37 changed files with 1117 additions and 1075 deletions

View File

@@ -1,13 +0,0 @@
import request from '@/config/axios'
export default {
callLogin(data) {
return request.post({ url: '/call-api/openapi/V2.0.4/agentLogin', data })
},
callUserStatus(data) {
return request.post({ url: '/call-api/openapi/V2.0.4/getAgentStatus', data })
},
callNumber(data) {
return request.post({ url: '/call-api/openapi/V2.0.4/callNumber', data })
}
}

View File

@@ -1,39 +0,0 @@
import request from '@/config/axios'
// 查询(精简)列表
export const getAfterSaleList = async (params) => {
return await request.get({ url: '/admin-api/crm/sign-after-sale/list', params })
}
// 查询(精简)列表
export const getAfterSalePage = async (params) => {
return await request.get({ url: '/admin-api/crm/sign-after-sale/page', params })
}
// 新增
export const createAfterSale = async (data) => {
return await request.post({
url: '/admin-api/crm/sign-after-sale/create',
data,
isSubmitForm: true
})
}
// 审核
export const auditAfterSale = async (data) => {
return await request.post({ url: '/admin-api/crm/sign-after-sale/check', data })
}
export const batchAuditAfterSale = async (data) => {
return await request.post({ url: '/admin-api/crm/sign-after-sale/batch/check', data })
}
// 撤销
export const cancelApplyAfterSale = async (data) => {
return await request.post({ url: '/admin-api/crm/sign-after-sale/revoke', params: data })
}
// 查询详情
export const getAfterSaleDetail = async (params) => {
return await request.get({ url: '/admin-api/crm/sign-after-sale/get', params })
}

View File

@@ -1,11 +0,0 @@
import request from '@/config/axios'
// 查询用户配置
export const getClueCache = async (params) => {
return await request.get({ url: '/admin-api/crm/param-user-setting/get-by-user', params })
}
// 保存用户配置
export const setClueCache = async (data) => {
return await request.post({ url: '/admin-api/crm/param-user-setting/save', data })
}

View File

@@ -1,40 +0,0 @@
import request from '@/config/axios'
// 创建
export const createField = (data) => {
return request.post({ url: '/admin-api/crm/param/create', data: { ...data, module: 1 } })
}
// 更新
export const updateField = (data) => {
return request.put({ url: '/admin-api/crm/param/update', data })
}
// 删除
export const deleteField = (id) => {
return request.delete({ url: `/admin-api/crm/param/delete?id=${id}` })
}
// 获得
export const getField = (id) => {
return request.get({ url: `/admin-api/crm/param/get?id=${id}` })
}
// 获得精简信息列表
export const getSimpleFieldList = () => {
return request.get({ url: '/admin-api/crm/param/simple-list', params: { module: 1 } })
}
// 获取自定义字段
export const getDiyFieldList = () => {
return request.get({ url: '/admin-api/crm/param/get-diy-param', params: { module: 1 } })
}
// 状态修改
export const updateFieldStatus = (signParamId, status) => {
const data = {
signParamId,
status
}
return request.put({ url: '/admin-api/crm/param/status/update', data: data })
}

View File

@@ -1,26 +0,0 @@
import request from '@/config/axios'
// 线索获取规则
export const getClueGainRuleList = () => {
return request.get({ url: '/admin-api/crm/sch-clue-gain-rule/list' })
}
// 删除
export const deleteClueGainRule = (id) => {
return request.delete({ url: `/admin-api/crm/sch-clue-gain-rule/delete?id=${id}` })
}
// 线索获取规则保存
export const saveClueGainRule = (data) => {
return request.put({ url: '/admin-api/crm/sch-clue-gain-rule/batchUpdate', data })
}
// 线索规则
export const getClueDistributeRuleByUser = (params) => {
return request.get({ url: '/admin-api/crm/sch-clue-distribution-rule/queryByUserId', params })
}
// 删除
export const deleteClueDistributeRule = (id) => {
return request.delete({ url: `/admin-api/crm/sch-clue-gain-rule/delete?id=${id}` })
}

View File

@@ -1,21 +0,0 @@
import request from '@/config/axios'
// 查询(精简)列表
export const getDeliveryList = async (params) => {
return await request.get({ url: '/admin-api/crm/sign-send/list', params })
}
// 查询分页列表
export const getDeliveryPage = async (params) => {
return await request.get({ url: '/admin-api/crm/sign-send/page', params })
}
// 新增
export const createDelivery = async (data) => {
return await request.post({ url: '/admin-api/crm/sign-send/create', data, isSubmitForm: true })
}
// 查询详情
export const getDeliveryDetail = async (params) => {
return await request.get({ url: '/admin-api/crm/sign-send/get', params })
}

View File

@@ -1,20 +0,0 @@
import request from '@/config/axios'
// 查询(精简)列表
export const getFollowList = async (params) => {
return await request.get({ url: '/admin-api/crm/clue-follow-record/list', params })
}
// 新增
export const createFollow = async (data) => {
return await request.post({
url: '/admin-api/crm/clue-follow-record/create',
data: data,
isSubmitForm: true
})
}
// 删除
export const deleteFollow = async (id) => {
return await request.delete({ url: '/admin-api/crm/clue-follow-record/delete?id=' + id })
}

View File

@@ -1,60 +0,0 @@
import request from '@/config/axios'
// 查询(精简)列表
export const getSimpleClueList = async () => {
return await request.get({ url: '/admin-api/crm/sch-clue/list-all-simple' })
}
// 查询列表
export const getCluePage = async (params) => {
return await request.get({ url: '/admin-api/crm/sch-clue/page', params })
}
// 查询详情
export const getClue = async (id) => {
return await request.get({ url: '/admin-api/crm/sch-clue/get?id=' + id })
}
// 新增
export const createClue = async (data) => {
return await request.post({
url: '/admin-api/crm/sch-clue/create',
data: data,
isSubmitForm: true
})
}
// 修改
export const updateClue = async (params) => {
return await request.put({ url: '/admin-api/crm/sch-clue/update', data: params })
}
// 删除
export const deleteClue = async (id) => {
return await request.delete({ url: '/admin-api/crm/sch-clue/delete?id=' + id })
}
// 释放
export const releaseClue = async (data) => {
return await request.put({ url: '/admin-api/crm/sch-clue/public/save', data })
}
// 通用查询数量
export const getClueCount = async () => {
return await request.get({ url: '/admin-api/crm/sch-clue/get-clue-num' })
}
// 获取操作记录
export const getOpearateRecord = async (params) => {
return await request.get({ url: '/admin-api/crm/clue-operate-record/list', params })
}
// 获取公海线索
export const getPublicClue = async (data) => {
return await request.put({ url: '/admin-api/crm/sch-clue/public/save', data })
}
// 获得线索跟进用户信息
export const getFollowUserList = async (params) => {
return await request.get({ url: '/admin-api/crm/sch-clue/get-follow-user', params })
}

View File

@@ -1,40 +0,0 @@
import request from '@/config/axios'
// 创建
export const createField = (data) => {
return request.post({ url: '/admin-api/crm/param/create', data: { ...data, module: 2 } })
}
// 更新
export const updateField = (data) => {
return request.put({ url: '/admin-api/crm/param/update', data })
}
// 删除
export const deleteField = (id) => {
return request.delete({ url: `/admin-api/crm/param/delete?id=${id}` })
}
// 获得
export const getField = (id) => {
return request.get({ url: `/admin-api/crm/param/get?id=${id}` })
}
// 获得精简信息列表
export const getSimpleFieldList = () => {
return request.get({ url: '/admin-api/crm/param/simple-list', params: { module: 2 } })
}
// 获取自定义字段
export const getDiyFieldList = () => {
return request.get({ url: '/admin-api/crm/param/get-diy-param', params: { module: 2 } })
}
// 状态修改
export const updateFieldStatus = (signParamId, status) => {
const data = {
signParamId,
status
}
return request.put({ url: '/admin-api/crm/param/status/update', data: data })
}

View File

@@ -1,39 +0,0 @@
import request from '@/config/axios'
// 查询(精简)列表
export const getPaymentList = async (params) => {
return await request.get({ url: '/admin-api/crm/sign-pay-record/list', params })
}
// 查询(精简)列表
export const getPaymentPage = async (params) => {
return await request.get({ url: '/admin-api/crm/sign-pay-record/page', params })
}
// 新增
export const createPayment = async (data) => {
return await request.post({
url: '/admin-api/crm/sign-pay-record/create',
data,
isSubmitForm: true
})
}
// 审核
export const auditPayment = async (data) => {
return await request.post({ url: '/admin-api/crm/sign-pay-record/check', data })
}
export const batchAuditPayment = async (data) => {
return await request.post({ url: '/admin-api/crm/sign-pay-record/batch/check', data })
}
// 撤销
export const cancelApplyPayment = async (data) => {
return await request.post({ url: '/admin-api/crm/sign-pay-record/revoke', params: data })
}
// 查询详情
export const getPaymentDetail = async (params) => {
return await request.get({ url: '/admin-api/crm/sign-pay-record/get', params })
}

View File

@@ -1,16 +0,0 @@
import request from '@/config/axios'
// 查询列表
export const getSettlePage = async (params) => {
return await request.get({ url: '/admin-api/crm/sign-settlement/page', params })
}
// 查询详情
export const getSettle = async (id) => {
return await request.get({ url: '/admin-api/crm/sign-settlement/get?id=' + id })
}
// 批量结算
export const batchSaveSettle = async (data) => {
return await request.post({ url: '/admin-api/crm/sign-settlement/batch/save', data })
}

View File

@@ -1,31 +0,0 @@
import request from '@/config/axios'
// 查询列表
export const getSignPage = async (params) => {
return await request.get({ url: '/admin-api/crm/sign/page', params })
}
// 查询详情
export const getSign = async (id) => {
return await request.get({ url: '/admin-api/crm/sign/get?id=' + id })
}
// 新增
export const createSign = async (data) => {
return await request.post({ url: '/admin-api/crm/sign/create', data: data, isSubmitForm: true })
}
// 取消登记
export const cancelDeal = async (id) => {
return await request.delete({ url: '/admin-api/crm/sign/delete?id=' + id })
}
// 新增支出
export const signAddPay = async (data) => {
return await request.post({ url: '/admin-api/crm/sign/extra-pay/save', data: data })
}
// 查询支出
export const getSignExtraPayList = async (params) => {
return await request.get({ url: '/admin-api/crm/sign/extra-pay/get', params })
}

View File

@@ -1,26 +0,0 @@
import request from '@/config/axios'
// 获得列表
export const getSkillPage = (params) => {
return request.get({ url: '/admin-api/crm/skill/page', params })
}
// 创建
export const createSkill = (data) => {
return request.post({ url: '/admin-api/crm/skill/create', data, isSubmitForm: true })
}
// 更新
export const updateSkill = (data) => {
return request.put({ url: '/admin-api/crm/skill/update', data })
}
// 删除
export const deleteSkill = (id) => {
return request.delete({ url: `/admin-api/crm/skill/delete?id=${id}` })
}
// 获得
export const getSkill = (id) => {
return request.get({ url: `/admin-api/crm/skill/get?id=${id}` })
}

View File

@@ -1,31 +0,0 @@
import request from '@/config/axios'
// 查询(精简)列表
export const getSimpleSourceList = async () => {
return await request.get({ url: '/admin-api/crm/source/list' })
}
// 查询列表
export const getSourcePage = async (params) => {
return await request.get({ url: '/admin-api/crm/source/list', params })
}
// 查询详情
export const getSource = async (id) => {
return await request.get({ url: '/admin-api/crm/source/get?id=' + id })
}
// 新增
export const createSource = async (data) => {
return await request.post({ url: '/admin-api/crm/source/create', data: data, isSubmitForm: true })
}
// 修改
export const updateSource = async (params) => {
return await request.put({ url: '/admin-api/crm/source/update', data: params })
}
// 删除
export const deleteSource = async (id) => {
return await request.delete({ url: '/admin-api/crm/source/delete?id=' + id })
}

View File

@@ -1,61 +0,0 @@
import request from '@/config/axios'
/**
* 商品品牌
*/
export interface BrandVO {
/**
* 品牌编号
*/
id?: number
/**
* 品牌名称
*/
name: string
/**
* 品牌图片
*/
picUrl: string
/**
* 品牌排序
*/
sort?: number
/**
* 品牌描述
*/
description?: string
/**
* 开启状态
*/
status: number
}
// 创建商品品牌
export const createBrand = (data: BrandVO) => {
return request.post({ url: '/admin-api/crm/erp-product-brand/create', data, isSubmitForm: true })
}
// 更新商品品牌
export const updateBrand = (data: BrandVO) => {
return request.put({ url: '/admin-api/crm/erp-product-brand/update', data })
}
// 删除商品品牌
export const deleteBrand = (id: number) => {
return request.delete({ url: `/admin-api/crm/erp-product-brand/delete?id=${id}` })
}
// 获得商品品牌
export const getBrand = (id: number) => {
return request.get({ url: `/admin-api/crm/erp-product-brand/get?id=${id}` })
}
// 获得商品品牌列表
export const getBrandParam = (params: PageParam) => {
return request.get({ url: '/admin-api/crm/erp-product-brand/page', params })
}
// 获得商品品牌精简信息列表
export const getSimpleBrandList = () => {
return request.get({ url: '/admin-api/crm/erp-product-brand/simple-list' })
}

View File

@@ -1,69 +0,0 @@
import request from '@/config/axios'
/**
* 产品分类
*/
export interface CategoryVO {
/**
* 分类编号
*/
id?: number
/**
* 父分类编号
*/
parentId?: number
/**
* 分类名称
*/
name: string
/**
* 移动端分类图
*/
picUrl: string
/**
* PC 端分类图
*/
bigPicUrl?: string
/**
* 分类排序
*/
sort: number
/**
* 开启状态
*/
status: number
}
// 创建商品分类
export const createCategory = (data: CategoryVO) => {
return request.post({
url: '/admin-api/crm/erp-product-category/create',
data,
isSubmitForm: true
})
}
// 更新商品分类
export const updateCategory = (data: CategoryVO) => {
return request.put({ url: '/admin-api/crm/erp-product-category/update', data })
}
// 删除商品分类
export const deleteCategory = (id: number) => {
return request.delete({ url: `/admin-api/crm/erp-product-category/delete?id=${id}` })
}
// 获得商品分类
export const getCategory = (id: number) => {
return request.get({ url: `/admin-api/crm/erp-product-category/get?id=${id}` })
}
// 获得商品分类列表
export const getCategoryList = (params: any) => {
return request.get({ url: '/admin-api/crm/erp-product-category/list', params })
}
// 获得商品分类列表
export const getCategorySimpleList = (params: any) => {
return request.get({ url: '/admin-api/crm/erp-product-category/simple-list', params })
}

View File

@@ -1,33 +0,0 @@
import request from '@/config/axios'
// 查询列表
export const getProductPage = async (params) => {
return await request.get({ url: '/admin-api/crm/erp-product/page', params })
}
// 查询详情
export const getProduct = async (id) => {
return await request.get({ url: '/admin-api/crm/erp-product/get?id=' + id })
}
// 新增
export const createProduct = async (data) => {
return await request.post({
url: '/admin-api/crm/erp-product/create',
data: data,
isSubmitForm: true
})
}
// 修改
export const updateProduct = async (params) => {
return await request.put({ url: '/admin-api/crm/erp-product/update', data: params })
}
// 删除
export const deleteProduct = async (id) => {
return await request.delete({ url: '/admin-api/crm/erp-product/delete?id=' + id })
}
export const getSimpleProductList = async () => {
return await request.get({ url: '/admin-api/crm/erp-product/simple-list' })
}

View File

@@ -1,44 +0,0 @@
import request from '@/config/axios'
// 创建
export const createField = (data) => {
return request.post({
url: '/admin-api/crm/param/create',
data: { ...data, module: 3 },
isSubmitForm: true
})
}
// 更新
export const updateField = (data) => {
return request.put({ url: '/admin-api/crm/param/update', data })
}
// 删除
export const deleteField = (id) => {
return request.delete({ url: `/admin-api/crm/param/delete?id=${id}` })
}
// 获得
export const getField = (id) => {
return request.get({ url: `/admin-api/crm/param/get?id=${id}` })
}
// 获得精简信息列表
export const getSimpleFieldList = () => {
return request.get({ url: '/admin-api/crm/param/simple-list', params: { module: 3 } })
}
// 获取自定义字段
export const getDiyFieldList = () => {
return request.get({ url: '/admin-api/crm/param/get-diy-param', params: { module: 3 } })
}
// 状态修改
export const updateFieldStatus = (signParamId, status) => {
const data = {
signParamId,
status
}
return request.put({ url: '/admin-api/crm/param/status/update', data: data })
}

View File

@@ -1,107 +0,0 @@
import request from '@/config/axios'
/**
* 商品属性
*/
export interface PropertyVO {
id?: number
/** 名称 */
name: string
/** 备注 */
remark?: string
}
/**
* 属性值
*/
export interface PropertyValueVO {
id?: number
/** 属性项的编号 */
propertyId?: number
/** 名称 */
name: string
/** 备注 */
remark?: string
}
/**
* 商品属性值的明细
*/
export interface PropertyValueDetailVO {
/** 属性项的编号 */
propertyId: number // 属性的编号
/** 属性的名称 */
propertyName: string
/** 属性值的编号 */
valueId: number
/** 属性值的名称 */
valueName: string
}
// ------------------------ 属性项 -------------------
// 创建属性项
export const createProperty = (data: PropertyVO) => {
return request.post({
url: '/admin-api/crm/erp-product-property/create',
data,
isSubmitForm: true
})
}
// 更新属性项
export const updateProperty = (data: PropertyVO) => {
return request.put({ url: '/product/property/update', data })
}
// 删除属性项
export const deleteProperty = (id: number) => {
return request.delete({ url: `/product/property/delete?id=${id}` })
}
// 获得属性项
export const getProperty = (id: number): Promise<PropertyVO> => {
return request.get({ url: `/product/property/get?id=${id}` })
}
// 获得属性项分页
export const getPropertyPage = (params: PageParam) => {
return request.get({ url: '/product/property/page', params })
}
// 获得属性项列表
export const getPropertyList = (params: any) => {
return request.get({ url: '/product/property/list', params })
}
// 获得属性项列表
export const getPropertyListAndValue = (data: any) => {
return request.post({ url: '/product/property/get-value-list', data })
}
// ------------------------ 属性值 -------------------
// 获得属性值分页
export const getPropertyValuePage = (params: PageParam & any) => {
return request.get({ url: '/product/property/value/page', params })
}
// 获得属性值
export const getPropertyValue = (id: number): Promise<PropertyValueVO> => {
return request.get({ url: `/product/property/value/get?id=${id}` })
}
// 创建属性值
export const createPropertyValue = (data: PropertyValueVO) => {
return request.post({ url: '/admin-api/crm/erp-product-property-value/create', data })
}
// 更新属性值
export const updatePropertyValue = (data: PropertyValueVO) => {
return request.put({ url: '/product/property/value/update', data })
}
// 删除属性值
export const deletePropertyValue = (id: number) => {
return request.delete({ url: `/product/property/value/delete?id=${id}` })
}

View File

@@ -1,29 +0,0 @@
import request from '@/config/axios'
// 查询列表
export const getPurchasePage = async (params) => {
return await request.get({ url: '/admin-api/crm/erp-purchase/page', params })
}
// 新增
export const createPurchase = async (data) => {
return await request.post({
url: '/admin-api/crm/erp-purchase/create',
data: data,
isSubmitForm: true
})
}
// 修改
export const updatePurchase = async (params) => {
return await request.put({ url: '/admin-api/crm/erp-purchase/update', data: params })
}
// 删除
export const deletePurchase = async (id) => {
return await request.delete({ url: '/admin-api/crm/erp-purchase/delete?id=' + id })
}
// 审核
export const auditPurchase = async (data) => {
return await request.post({ url: '/admin-api/crm/erp-purchase/audit', data })
}

View File

@@ -1,40 +0,0 @@
import request from '@/config/axios'
export interface DeliveryExpressVO {
id: number
code: string
name: string
logo: string
sort: number
status: number
}
// 查询快递公司列表
export const getDeliveryExpressPage = async (params: PageParam) => {
return await request.get({ url: '/trade/delivery/express/page', params })
}
// 查询快递公司详情
export const getDeliveryExpress = async (id: number) => {
return await request.get({ url: '/trade/delivery/express/get?id=' + id })
}
// 新增快递公司
export const createDeliveryExpress = async (data: DeliveryExpressVO) => {
return await request.post({ url: '/trade/delivery/express/create', data })
}
// 修改快递公司
export const updateDeliveryExpress = async (data: DeliveryExpressVO) => {
return await request.put({ url: '/trade/delivery/express/update', data })
}
// 删除快递公司
export const deleteDeliveryExpress = async (id: number) => {
return await request.delete({ url: '/trade/delivery/express/delete?id=' + id })
}
// 导出快递公司 Excel
export const exportDeliveryExpressApi = async (params) => {
return await request.download({ url: '/trade/delivery/express/export-excel', params })
}

View File

@@ -1,54 +0,0 @@
import request from '@/config/axios'
export interface DeliveryExpressTemplateVO {
id: number
name: string
chargeMode: number
sort: number
templateCharge: ExpressTemplateChargeVO[]
templateFree: ExpressTemplateFreeVO[]
}
export declare type ExpressTemplateChargeVO = {
areaIds: number[]
startCount: number
startPrice: number
extraCount: number
extraPrice: number
}
export declare type ExpressTemplateFreeVO = {
areaIds: number[]
freeCount: number
freePrice: number
}
// 查询快递运费模板列表
export const getDeliveryExpressTemplatePage = async (params: PageParam) => {
return await request.get({ url: '/trade/delivery/express-template/page', params })
}
// 查询快递运费模板详情
export const getDeliveryExpressTemplate = async (id: number) => {
return await request.get({ url: '/trade/delivery/express-template/get?id=' + id })
}
// 新增快递运费模板
export const createDeliveryExpressTemplate = async (data: DeliveryExpressTemplateVO) => {
return await request.post({ url: '/trade/delivery/express-template/create', data })
}
// 修改快递运费模板
export const updateDeliveryExpressTemplate = async (data: DeliveryExpressTemplateVO) => {
return await request.put({ url: '/trade/delivery/express-template/update', data })
}
// 删除快递运费模板
export const deleteDeliveryExpressTemplate = async (id: number) => {
return await request.delete({ url: '/trade/delivery/express-template/delete?id=' + id })
}
// 导出快递运费模板 Excel
export const exportDeliveryExpressTemplateApi = async (params) => {
return await request.download({ url: '/trade/delivery/express-template/export-excel', params })
}

View File

@@ -1,49 +0,0 @@
import request from '@/config/axios'
// 查询列表
export const getWarehousePage = async (params) => {
return await request.get({ url: '/admin-api/crm/erp-warehouse/page', params })
}
// 新增
export const createWarehouse = async (data) => {
return await request.post({
url: '/admin-api/crm/erp-warehouse/create',
data: data,
isSubmitForm: true
})
}
// 修改
export const updateWarehouse = async (params) => {
return await request.put({ url: '/admin-api/crm/erp-warehouse/update', data: params })
}
// 删除
export const deleteWarehouse = async (id) => {
return await request.delete({ url: '/admin-api/crm/erp-warehouse/delete?id=' + id })
}
// 获取仓库
export const getWarehouse = async (id) => {
return await request.get({ url: '/admin-api/crm/erp-warehouse/get?id=' + id })
}
// 获取仓库列表
export const getSimpleWarehouseList = async () => {
return await request.get({ url: '/admin-api/crm/erp-warehouse/simple-list' })
}
// 获取库存
export const getInventoryList = async (params) => {
return await request.get({ url: '/admin-api/crm/erp-inventory/page', params })
}
// 获取库存变动记录
export const getInventoryRecord = async (params) => {
return await request.get({ url: '/admin-api/crm/erp-inventory-record/page', params })
}
// 获取剩余库存
export const getRemainInventoryList = async (params) => {
return await request.get({ url: '/admin-api/crm/erp-inventory-detail/list', params })
}

View File

@@ -1,54 +0,0 @@
import request from '@/config/axios'
// 查询列表-分页
export const getClassTypePage = async (params) => {
return await request.get({ url: '/admin-api/crm/sch-class-type/page', params })
}
export const getClassTypeList = async (params) => {
return await request.get({ url: '/admin-api/crm/sch-class-type/list', params })
}
// 查询详情
export const getClassType = async (id) => {
return await request.get({ url: '/admin-api/crm/sch-class-type/get?id=' + id })
}
// 新增
export const createClassType = async (data) => {
return await request.post({
url: '/admin-api/crm/sch-class-type/create',
data: data,
isSubmitForm: true
})
}
// 修改
export const updateClassType = async (params) => {
return await request.put({ url: '/admin-api/crm/sch-class-type/update', data: params })
}
// 删除
export const deleteClassType = async (id) => {
return await request.delete({ url: '/admin-api/crm/sch-class-type/delete?id=' + id })
}
// 修改状态
export const updateClassTypeStatus = async (data) => {
return request.put({ url: '/admin-api/crm/sch-class-type/status/update', data })
}
// 批量修改状态
export const batchUpdateClassTypeStatus = async (data) => {
return request.put({ url: '/admin-api/crm/sch-class-type/status/batch-update', data })
}
// 批量删除
export const batchDeleteClassType = async (ids) => {
return await request.delete({ url: '/admin-api/crm/sch-class-type/batch-delete?ids=' + ids })
}
// 获取提成结算参数
export const getCommissionParams = async () => {
return await request.get({ url: '/admin-api/crm/sch-class-type/get-percentage-param' })
}

View File

@@ -1,43 +0,0 @@
import request from '@/config/axios'
// 查询列表-分页
export const getPlacePage = async (params) => {
return await request.get({ url: '/admin-api/crm/sch-place/page', params })
}
// 查询列表-不分页
export const getPlaceList = async (params) => {
return await request.get({ url: '/admin-api/crm/sch-place/list', params })
}
// 查询详情
export const getPlace = async (id) => {
return await request.get({ url: '/admin-api/crm/sch-place/get?id=' + id })
}
// 新增
export const createPlace = async (data) => {
return await request.post({
url: '/admin-api/crm/sch-place/create',
data: data,
isSubmitForm: true
})
}
// 修改
export const updatePlace = async (params) => {
return await request.put({ url: '/admin-api/crm/sch-place/update', data: params })
}
// 删除
export const deletePlace = async (id) => {
return await request.delete({ url: '/admin-api/crm/sch-place/delete?id=' + id })
}
export const updatePlaceStatus = async (placeId, status) => {
const data = {
placeId,
status
}
return request.put({ url: '/admin-api/crm/sch-place/status/update', data: data })
}

View File

@@ -1,37 +0,0 @@
import request from '@/config/axios'
// 查询列表
export const getSchoolPage = async (params) => {
return await request.get({ url: '/admin-api/crm/sch-school/page', params })
}
// 查询详情
export const getSchool = async (id) => {
return await request.get({ url: '/admin-api/crm/sch-school/get?id=' + id })
}
// 新增
export const createSchool = async (data) => {
return await request.post({
url: '/admin-api/crm/sch-school/create',
data: data,
isSubmitForm: true
})
}
// 修改
export const updateSchool = async (params) => {
return await request.put({ url: '/admin-api/crm/sch-school/update', data: params })
}
// 删除
export const deleteSchool = async (id) => {
return await request.delete({ url: '/admin-api/crm/sch-school/delete?id=' + id })
}
export const updateSchoolStatus = async (schoolId, status) => {
const data = {
schoolId,
status
}
return request.put({ url: '/admin-api/crm/sch-school/status/update', data: data })
}

View File

@@ -106,27 +106,27 @@ const remainingRouter: AppRouteRecordRaw[] = [
}
]
},
// {
// path: '/Basic',
// component: Layout,
// name: 'Basic',
// meta: {},
// redirect: '/Basic/menu',
// children: [
// {
// path: 'menu',
// component: () => import('@/views/Basic/Menu/index.vue'),
// name: 'Menu',
// meta: {
// canTo: true,
// hidden: true,
// noTagsView: false,
// icon: 'ep:user',
// title: '菜单管理'
// }
// }
// ]
// },
{
path: '/Basic',
component: Layout,
name: 'Basic',
meta: {},
redirect: '/Basic/menu',
children: [
{
path: 'menu',
component: () => import('@/views/Basic/Menu/index.vue'),
name: 'Menu',
meta: {
canTo: true,
hidden: true,
noTagsView: false,
icon: 'ep:user',
title: '菜单管理'
}
}
]
},
{
path: '/login',
component: () => import('@/views/Login/Login.vue'),

View File

@@ -1,7 +1,7 @@
<template>
<Dialog v-model="dialogVisible" :title="dialogTitle" style="width: 1000px">
<el-form
:model="comissionForm"
:model="formData"
ref="formRef"
:rules="rules"
class="mt-10px"
@@ -11,12 +11,12 @@
<el-row :gutter="20">
<el-col :span="12" :offset="0">
<el-form-item label="方案名称" prop="name">
<el-input v-model="comissionForm.name" placeholder="请输入方案名称" clearable />
<el-input v-model="formData.name" placeholder="请输入方案名称" clearable />
</el-form-item>
</el-col>
<el-col :span="12" :offset="0">
<el-form-item label="结算方式">
<el-radio-group v-model="comissionForm.percentageType">
<el-radio-group v-model="formData.percentageType">
<el-radio :label="1">
<Tooltip message="可配置多级,命中某档位后,按照档位分级结算" />阶梯结算
</el-radio>
@@ -35,7 +35,7 @@
:span="24"
:offset="0"
class="flex"
v-for="(item, index) in comissionForm.rules"
v-for="(item, index) in formData.rules"
:key="index"
>
<el-select v-model="item.ruleParam1" style="width: 100px">
@@ -107,6 +107,85 @@
</div>
</el-col>
</el-row>
<el-divider direction="horizontal" />
<el-row :gutter="20">
<el-col :span="12" :offset="0">
<el-form-item label="是否扣除其他支出" labelWidth="150px">
<el-radio-group v-model="formData.qitazhichu">
<el-radio :label="0"> </el-radio>
<el-radio :label="1"> </el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" :offset="0">
<el-form-item label="是否扣除售后" labelWidth="150px">
<el-radio-group v-model="formData.shouhou">
<el-radio :label="0"> </el-radio>
<el-radio :label="1"> </el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12" :offset="0">
<el-form-item label="是否关联成交率" labelWidth="150px">
<el-radio-group v-model="formData.saleCommissionRelateDealConfig">
<el-radio label="true"> </el-radio>
<el-radio label="false"> </el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" :offset="0">
<el-form-item label="提成计算时间" labelWidth="150px">
<el-radio-group v-model="formData.jisuanshijian">
<el-radio :label="1">成交后</el-radio>
<el-radio :label="2">回款后</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12" :offset="0">
<el-form-item label="关联规则" v-if="formData.saleCommissionRelateDealConfig == 'true'">
<div>
<el-button @click="formData.saleCommissionRelateRulesConfig.push({})">
新增规则
</el-button>
<div
v-for="(item, index) in formData.saleCommissionRelateRulesConfig"
:key="index"
class="mt-10px flex justify-center items-center"
>
<span>成交率达</span>
<el-input
class="ml-10px"
v-model="item.successRate"
placeholder="成交率"
style="width: 100px"
type="number"
:min="0"
>
<template #suffix>%</template>
</el-input>
<span>可结算</span>
<el-input
class="ml-10px"
v-model="item.comissionRate"
placeholder="提成率"
style="width: 100px"
type="number"
:min="0"
>
<template #suffix>%</template>
</el-input>
<span>提成</span>
</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
@@ -118,14 +197,14 @@
</Dialog>
</template>
<script setup name="DialogSalarySetting">
<script setup name="DialogCommissionPlan">
const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('工资条设置')
const formLoading = ref(false) // 表单的加载中1修改时的数据加载2提交的按钮禁用
const comissionForm = ref({})
const formData = ref({})
const rules = {
name: { required: true, message: '方案名称不可为空', trigger: 'blur' }
}
@@ -154,7 +233,7 @@ const open = async (type, row) => {
if (row?.id) {
formLoading.value = true
try {
// comissionForm.value = await UserApi.getUser(id)
// formData.value = await UserApi.getUser(id)
} finally {
formLoading.value = false
}
@@ -164,7 +243,7 @@ defineExpose({ open }) // 提供 open 方法,用于打开弹窗
/** 重置表单 */
const resetForm = () => {
comissionForm.value = {
formData.value = {
name: undefined,
percentageType: 1,
rules: [
@@ -176,13 +255,15 @@ const resetForm = () => {
ruleParam5: 1,
ruleParam6: 10
}
]
],
saleCommissionRelateDealConfig: 'false',
saleCommissionRelateRulesConfig: []
}
formRef.value?.resetFields()
}
function handleAddRules() {
comissionForm.value.rules.push({
formData.value.rules.push({
ruleParam1: 1,
ruleParam2: 1,
ruleParam3: 0,

View File

@@ -61,6 +61,10 @@ const searchForm = ref({
pageSize: 20
})
onMounted(() => {
handleQuery()
})
/** 搜索按钮操作 */
const handleQuery = () => {
searchForm.value.pageNo = 1

View File

@@ -46,6 +46,10 @@ const searchForm = ref({
pageSize: 20
})
onMounted(() => {
handleQuery()
})
/** 搜索按钮操作 */
const handleQuery = () => {
searchForm.value.pageNo = 1

View File

@@ -0,0 +1,53 @@
<template>
<Dialog v-model="dialogVisible" title="生成工资条" style="width: 800px">
<el-form :model="formData" ref="formRef" :rules="rules" label-width="80px">
<el-row :gutter="20">
<el-col :span="12" :offset="0">
<el-form-item label="年月" prop="yearmonth">
<el-date-picker v-model="formData.yearmonth" type="month" placeholder="选择年月" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12" :offset="0">
<el-form-item label="导入奖金" size="normal">
<UploadFile v-model="formData.files1" :limit="1" :isShowTip="false" />
</el-form-item>
</el-col>
<el-col :span="12" :offset="0">
<el-form-item label="导入考勤" size="normal">
<UploadFile v-model="formData.files2" :limit="1" :isShowTip="false" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<span>
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" :disabled="formLoading" @click="handleSave">
</el-button>
</span>
</template>
</Dialog>
</template>
<script setup name="DialogCreateSalary">
const dialogVisible = ref(false)
const formData = ref({})
const formLoading = ref(false)
const rules = {}
function open() {
dialogVisible.value = true
}
defineExpose({ open })
function handleSave() {}
</script>
<style lang="scss" scoped></style>

View File

@@ -1,7 +1,354 @@
<template>
<div> 工资条 </div>
<div>
<el-form :model="searchForm" ref="searchFormRef" inline>
<el-form-item>
<el-input v-model="searchForm.employeeName" placeholder="员工姓名" />
</el-form-item>
<el-form-item>
<el-date-picker
v-model="searchForm.month"
type="month"
placeholder="年月"
format="YYYY-MM"
value-format="YYYY-MM"
style="width: 100%"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleSearch">查询</el-button>
<el-button type="primary" plain @click="craeteSalary">生成工资条</el-button>
<el-button type="primary" @click="importHistorySalary">导入历史工资条</el-button>
</el-form-item>
</el-form>
<el-table
v-loading="loading"
:data="tableList"
border
stripe
:default-expand-all="false"
row-key="id"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
:span-method="spanMethod"
>
<el-table-column label="姓名" min-width="90px">
<template #default="{ row }">
<span v-if="row.children && row.children.length">
<span>{{ row.yearmonth }}</span>
<span class="ml-20px">应发工资人数30</span>
</span>
<span v-else>
{{ row.name }}
</span>
</template>
</el-table-column>
<el-table-column prop="dept" label="部门" min-width="90px" />
<el-table-column prop="job" label="职位" min-width="90px" />
<el-table-column label="应发工资" align="center">
<el-table-column label="基本工资" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="补贴" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="提成" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="满勤" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="绩效" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="其他" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="小计" min-width="90px" />
</el-table-column>
<el-table-column label="应发工资" align="center">
<el-table-column label="基本工资" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="请假" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="缺勤" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="旷工" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="违纪" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="公积金" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="社保" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="所得税" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="其他" min-width="90px">
<template #default="{ row }">
<el-input-number
v-if="row.edit"
v-model="row.jbgz"
:min="0"
:controls="false"
size="small"
style="width: 65px"
/>
<span v-else> {{ row.jbgz }}</span>
</template>
</el-table-column>
<el-table-column label="小计" min-width="90px" />
</el-table-column>
<el-table-column label="实发工资" fixed="right" />
<el-table-column label="操作" fixed="right" width="200">
<template #default="{ row }">
<el-button
type="primary"
style="padding: 0"
v-if="!row.edit && row.yearmonth"
text
@click="handleEdit(row)"
>
修改
</el-button>
<el-button
type="primary"
v-else-if="row.edit && row.yearmonth"
text
style="padding: 0"
@click="handleSave(row)"
>
保存
</el-button>
<el-button
type="danger"
v-if="row.yearmonth"
style="padding: 0"
text
@click="handleSave(row)"
>
封存
</el-button>
</template>
</el-table-column>
</el-table>
<DialogCreateSalary ref="createSalaryRef" @success="getList" />
<DialogImportSalary ref="importSalaryRef" @success="getList" />
</div>
</template>
<script setup name="SalarySlip"></script>
<script setup name="SalarySlip">
import DialogCreateSalary from './Comp/DialogCreateSalary.vue'
const searchForm = ref({})
<style lang="scss" scoped></style>
onMounted(() => {
handleSearch()
})
function handleSearch() {
searchForm.value.pageNO = 1
getList()
}
const loading = ref(false)
const tableList = ref([])
const total = ref(0)
function getList() {
tableList.value = [
{
yearmonth: '2024-06',
id: 1,
children: [
{ id: 11, name: '张三' },
{ id: 12, name: '李四' }
]
}
]
total.value = 0
}
const createSalaryRef = ref()
function craeteSalary() {
createSalaryRef.value.open()
}
function importHistorySalary() {}
function spanMethod({ row, columnIndex }) {
if (row.children && row.children.length > 0) {
if (columnIndex === 0) {
return [1, 21]
} else if (columnIndex == 21) {
return [1, 1]
} else {
return [0, 0]
}
}
}
function handleEdit(row) {
row.edit = true
row.children.forEach((it) => (it.edit = true))
}
function handleSave(row) {
row.edit = false
row.children.forEach((it) => (it.edit = false))
}
</script>
<style lang="scss" scoped>
:deep(.el-table__indent) {
display: none;
}
:deep(.el-table__placeholder) {
display: none;
}
</style>

View File

@@ -0,0 +1,236 @@
<template>
<Dialog v-model="dialogVisible" :title="dialogTitle" style="width: 800px">
<el-form
ref="formRef"
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="员工姓名" prop="nickname">
<el-input v-model="formData.nickname" placeholder="请输入员工姓名" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="用户性别">
<el-radio-group v-model="formData.sex">
<el-radio :label="1"> </el-radio>
<el-radio :label="2"> </el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="入职日期" prop="hireDate">
<el-date-picker
v-model="formData.hireDate"
type="date"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
placeholder="选择日期时间"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="职位" prop="job">
<el-input v-model="formData.job" placeholder="请输入职位" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="手机号码" prop="mobile">
<el-input v-model="formData.mobile" maxlength="11" placeholder="请输入手机号码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" maxlength="50" placeholder="请输入邮箱" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12" :offset="0">
<el-form-item label="考勤方案" prop="kaoqinfangan">
<el-select
v-model="formData.kaoqinfangan"
placeholder="选择考勤方案"
clearable
filterable
>
<el-option
v-for="item in kaoqinfanganOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" :offset="0">
<el-form-item label="开通系统" prop="kaitongxitong">
<el-select
v-model="formData.kaitongxitong"
placeholder="选择考勤方案"
multiple
clearable
filterable
>
<el-option
v-for="item in kaitongxitongOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item v-if="formData.id === undefined" label="登录账号" prop="username">
<el-input v-model="formData.username" placeholder="请输入登录账号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="formData.id === undefined" label="用户密码" prop="password">
<el-input
v-model="formData.password"
placeholder="请输入用户密码"
show-password
type="password"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="备注">
<el-input v-model="formData.remark" placeholder="请输入内容" type="textarea" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script name="DialogEmployee" setup>
import { CommonStatusEnum } from '@/utils/constants'
import { formatDate } from '@/utils/formatTime'
import * as UserApi from '@/api/system/user'
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 表单的加载中1修改时的数据加载2提交的按钮禁用
const formType = ref('') // 表单的类型create - 新增update - 修改
const formData = ref({
nickname: '',
deptId: '',
mobile: '',
email: '',
id: undefined,
username: '',
password: '',
sex: 1,
remark: '',
status: CommonStatusEnum.ENABLE,
hireDate: '',
kaoqinfangan: undefined,
kaitongxitong: []
})
const formRules = ref({
nickname: [{ required: true, message: '员工姓名不能为空', trigger: 'blur' }],
job: { required: true, message: '职位不能为空', trigger: 'blur' },
email: [
{
type: 'email',
message: '请输入正确的邮箱地址',
trigger: ['blur', 'change']
}
],
mobile: [{ required: true, message: '手机号不能为空', trigger: 'blur' }]
})
const formRef = ref() // 表单 Ref
const kaoqinfanganOptions = ref([])
const kaitongxitongOptions = ref([])
/** 打开弹窗 */
const open = async (type, id) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
// 修改时,设置数据
if (id) {
formLoading.value = true
try {
formData.value = await UserApi.getUser(id)
} finally {
formLoading.value = false
}
}
getOptions()
}
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
function getOptions() {
kaoqinfanganOptions.value = []
kaitongxitongOptions.value = []
}
/** 提交表单 */
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
const submitForm = async () => {
// 校验表单
if (!formRef.value) return
const valid = await formRef.value.validate()
if (!valid) return
// 提交请求
formLoading.value = true
try {
const data = formData.value
if (formType.value === 'create') {
await UserApi.createUser(data)
message.success(t('common.createSuccess'))
} else {
await UserApi.updateUser(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
// 发送操作成功的事件
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
nickname: '',
deptId: '',
mobile: '',
email: '',
id: undefined,
username: '',
password: '',
sex: 1,
remark: '',
status: CommonStatusEnum.ENABLE,
hireDate: formatDate(new Date(), 'YYYY-MM-DD'),
kaoqinfangan: undefined,
kaitongxitong: []
}
formRef.value?.resetFields()
}
</script>

View File

@@ -11,18 +11,56 @@
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">搜索</el-button>
<el-button type="primary" plain @click="handleQuery">新增</el-button>
<el-button @click="handleQuery" v-hasPermi="['pers:employee:search']">搜索</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['pers:employee:add']"
>
新增
</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="tableList" border stripe>
<el-table-column type="index" width="50" />
<el-table-column label="用户姓名" prop="nickname" />
<el-table-column label="部门" key="deptName" prop="deptName" />
<el-table-column label="职位" prop="job" />
<el-table-column label="手机号码" prop="mobile" width="120" />
<el-table-column label="考勤方案" />
<el-table-column label="在职状态" prop="status" width="150" />
<el-table-column label="已开通系统" />
<el-table-column label="在职状态" key="status" width="150">
<template #default="scope">
<el-switch
v-model="scope.row.status"
:active-value="0"
:inactive-value="1"
v-hasPermi="['pers:employee:update']"
@change="handleStatusChange(scope.row)"
/>
</template>
</el-table-column>
<el-table-column label="操作" width="260">
<template #default="scope">
<el-button
type="primary"
link
@click="openForm('update', scope.row.id)"
v-hasPermi="['pers:employee:update']"
>
修改
</el-button>
<el-button
type="primary"
link
@click="handleDelete(scope.row.id)"
v-hasPermi="['pers:employee:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<Pagination
:total="total"
@@ -30,10 +68,12 @@
v-model:limit="searchForm.pageSize"
@pagination="getList"
/>
<DialogEmployee ref="formRef" @success="getList" />
</div>
</template>
<script name="OAEmployee" setup>
import DialogEmployee from './Comp/DialogEmployee.vue'
const searchForm = ref({
name: undefined,
status: 0,
@@ -41,6 +81,10 @@ const searchForm = ref({
pageSize: 20
})
onMounted(() => {
handleQuery()
})
/** 搜索按钮操作 */
const handleQuery = () => {
searchForm.value.pageNo = 1
@@ -54,7 +98,7 @@ const total = ref(0)
const getList = async () => {
loading.value = true
try {
tableList.value = [1, 2]
tableList.value = [{ status: 0 }]
// const data = await UserApi.getUserPage(queryParams)
// tableList.value = data.list
// total.value = data.total
@@ -62,6 +106,41 @@ const getList = async () => {
loading.value = false
}
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type, id = undefined) => {
formRef.value.open(type, id)
}
/** 修改用户状态 */
const handleStatusChange = async (row) => {
try {
// 修改状态的二次确认
const text = row.status === 0 ? '启用' : '停用'
await message.confirm('确认要"' + text + '""' + row.nickname + '"用户吗?')
// 发起修改状态
await UserApi.updateUserStatus(row.id, row.status)
// 刷新列表
await getList()
} catch {
// 取消后,进行恢复按钮
row.status = row.status === 0 ? 1 : 0
}
}
/** 删除按钮操作 */
const handleDelete = async (id) => {
try {
// 删除的二次确认
await message.delConfirm()
// 发起删除
await UserApi.deleteUser(id)
message.success(t('common.delSuccess'))
// 刷新列表
await getList()
} catch {}
}
</script>
<style lang="scss" scoped></style>

View File

@@ -0,0 +1,105 @@
<template>
<div>
<el-form :model="searchForm" inline>
<el-form-item>
<el-input v-model="searchForm.name" placeholder="方案名称" />
</el-form-item>
<el-form-item>
<el-select v-model="searchForm.status" placeholder="启用状态" clearable filterable>
<el-option label="启用" :value="0" />
<el-option label="停用" :value="1" />
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">搜索</el-button>
<el-button type="primary" plain @click="openForm('create')"> 新增 </el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="tableList" border stripe>
<el-table-column type="index" width="50" />
<el-table-column label="方案名称" prop="name" />
<el-table-column label="启用状态" prop="status">
<template #default="scope">
<el-switch
v-model="scope.row.status"
:active-value="0"
:inactive-value="1"
@change="handleStatusChange(scope.row)"
/>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<template #default="scope">
<el-button type="primary" link @click="openForm('update', scope.row)"> 修改 </el-button>
<el-button type="primary" link @click="handleDelete(scope.row.id)"> 删除 </el-button>
</template>
</el-table-column>
</el-table>
<Pagination
:total="total"
v-model:page="searchForm.pageNo"
v-model:limit="searchForm.pageSize"
@pagination="getList"
/>
<DialogPlan ref="planDialogRef" @success="getList" />
</div>
</template>
<script name="PersSetting" setup>
import DialogPlan from './DialogPlan.vue'
const searchForm = ref({
name: undefined,
status: undefined,
pageNo: 1,
pageSize: 20
})
onMounted(() => {
handleQuery()
})
/** 搜索按钮操作 */
const handleQuery = () => {
searchForm.value.pageNo = 1
getList()
}
const loading = ref(false)
const tableList = ref([])
const total = ref(0)
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
tableList.value = [{ status: 0 }]
// const data = await UserApi.getUserPage(queryParams)
// tableList.value = data.list
// total.value = data.total
} finally {
loading.value = false
}
}
const planDialogRef = ref()
function openForm(type, row = undefined) {
planDialogRef.value.open(type, row)
}
const handleStatusChange = async (row) => {
try {
// 修改状态的二次确认
const text = row.status === 0 ? '启用' : '停用'
await message.confirm('确认要"' + text + '""' + row.name + '"方案吗?')
// 发起修改状态
// await UserApi.updateUserStatus(row.id, row.status)
// 刷新列表
await getList()
} catch {
// 取消后,进行恢复按钮
row.status = row.status === 0 ? 1 : 0
}
}
</script>
<style lang="scss" scoped></style>

View File

@@ -0,0 +1,158 @@
<template>
<Dialog v-model="dialogVisible" :title="dialogTitle" style="width: 1200px">
<el-form :model="form" ref="formRef" :rules="rules" label-width="80px">
<el-form-item label="方案名称" prop="name">
<el-input v-model="form.name" placeholder="请输入方案名称" style="width: 240px" />
</el-form-item>
</el-form>
<div class="mt-10px mb-10px">
<el-button type="primary" @click="handleAddYearPlan"> 添加年度考勤方案 </el-button>
<span class="ml-20px font-bold">请配置每月计薪天数计薪天数 = 应出勤天数 + 带薪假天数</span>
</div>
<el-table :data="form.planList" border stripe>
<el-table-column label="年份" width="150px">
<template #default="{ row }">
<el-date-picker
v-model="row.year"
type="year"
placeholder="选择年份"
format="YYYY"
value-format="YYYY"
style="width: 120px"
/>
</template>
</el-table-column>
<el-table-column
v-for="item in 12"
:prop="item"
:key="item"
:label="item + '月'"
width="140px"
>
<el-table-column label="应出勤">
<template #default="{ row }">
<el-input-number
v-model="row[item].yingchuqin"
size="small"
:min="1"
:max="31"
:controls="false"
style="width: 50px"
/>
</template>
</el-table-column>
<el-table-column label="带薪假">
<template #default="{ row }">
<el-input-number
v-model="row[item].daixinjia"
size="small"
:min="0"
:max="31"
:controls="false"
style="width: 50px"
/>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="操作" :width="80" fixed="right">
<template #default="{ $index }">
<Icon icon="ep:remove-filled" class="text-red-500" @click="handleRemove($index)" />
</template>
</el-table-column>
</el-table>
<template #footer>
<span>
<el-button @click="dialogVisible = false">取消</el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">保存</el-button>
</span>
</template>
</Dialog>
</template>
<script setup name="DialogAttendancePlan">
const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('考勤方案设置')
const formLoading = ref(false) // 表单的加载中1修改时的数据加载2提交的按钮禁用
const formType = ref('create')
/** 打开弹窗 */
const open = async (type, row) => {
dialogVisible.value = true
dialogTitle.value = type == 'create' ? `新增方案` : '修改方案'
formType.value = type
resetForm()
if (row?.id) {
formLoading.value = true
try {
// comissionForm.value = await UserApi.getUser(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
const form = ref({})
const rules = {
name: { required: true, message: '方案名称不可为空', trigger: 'blur' }
}
function resetForm() {
form.value = {
name: undefined,
planList: []
}
}
function handleAddYearPlan() {
form.value.planList.push({
year: new Date().getFullYear(),
1: { yingchuqin: undefined, daixinjia: undefined },
2: { yingchuqin: undefined, daixinjia: undefined },
3: { yingchuqin: undefined, daixinjia: undefined },
4: { yingchuqin: undefined, daixinjia: undefined },
5: { yingchuqin: undefined, daixinjia: undefined },
6: { yingchuqin: undefined, daixinjia: undefined },
7: { yingchuqin: undefined, daixinjia: undefined },
8: { yingchuqin: undefined, daixinjia: undefined },
9: { yingchuqin: undefined, daixinjia: undefined },
10: { yingchuqin: undefined, daixinjia: undefined },
11: { yingchuqin: undefined, daixinjia: undefined },
12: { yingchuqin: undefined, daixinjia: undefined }
})
}
const emit = defineEmits(['success'])
const formRef = ref()
const submitForm = async () => {
// 校验表单
if (!formRef.value) return
const valid = await formRef.value.validate()
if (!valid) return
// 提交请求
formLoading.value = true
try {
if (formType.value === 'create') {
// await ClassApi.createClassType(data)
message.success(t('common.createSuccess'))
} else {
// await ClassApi.updateClassType(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
// 发送操作成功的事件
emit('success')
} finally {
formLoading.value = false
}
}
function handleRemove(index) {
form.value.planList.splice(index, 1)
}
</script>
<style lang="scss" scoped></style>

View File

@@ -1,7 +1,15 @@
<template>
<div> 人事配置 </div>
<el-tabs v-model="tabName">
<el-tab-pane label="考勤方案" name="kqfa">
<AttendancePlan />
</el-tab-pane>
</el-tabs>
</template>
<script setup name="PersSetting"></script>
<script setup name="PersSetting">
import AttendancePlan from './Comp/AttendancePlan.vue'
<style lang="scss" scoped></style>
const tabName = ref('kqfa')
</script>
<style scoped></style>