初始提交

This commit is contained in:
2026-01-04 11:09:06 +08:00
commit 8fa31df250
1326 changed files with 213907 additions and 0 deletions

View File

@@ -0,0 +1,388 @@
<template>
<view class="jnpf-wrap jnpf-wrap-workflow">
<u-form :model="dataForm" :rules="rules" ref="dataForm" :errorType="['toast']" label-position="left"
label-width="150" label-align="left" v-show="hide">
<view class="u-p-l-20 u-p-r-20 form-item-box">
<u-form-item label="订单编码" prop="orderCode" v-if="judgeShow('orderCode')"
:required="requiredList.orderCode">
<u-input v-model="dataForm.orderCode" placeholder="订单编码" disabled input-align="right"></u-input>
</u-form-item>
<u-form-item label="客户名称" prop="customerId" :required="requiredList.customerName"
v-if="judgeShow('customerName')">
<JnpfTreeSelect v-model="dataForm.customerId" placeholder="请选择客户名称" :options="customerOptions"
@change="onCustomerChange" :props="props" :disabled="judgeWrite('customerName')" />
</u-form-item>
<u-form-item label="业务人员" prop="salesmanId" :required="requiredList.salesmanId"
v-if="judgeShow('salesmanId')">
<JnpfUserSelect v-model="dataForm.salesmanId" placeholder="请选择业务人员" @change="onChange"
:disabled="judgeWrite('salesmanId')" />
</u-form-item>
<u-form-item label="订单日期" prop="orderDate" :required="requiredList.orderDate"
v-if="judgeShow('orderDate')">
<JnpfDatePicker format="yyyy-MM-dd" placeholder="请选择订单日期" v-model="dataForm.orderDate"
:disabled="judgeWrite('orderDate')" />
</u-form-item>
</view>
<view class="jnpf-card">
<view class="u-p-l-20 u-p-r-20 form-item-box">
<u-form-item label="付款方式" prop="paymentMode" :required="requiredList.paymentMode"
v-if="judgeShow('paymentMode')">
<JnpfSelect v-model="dataForm.paymentMode" placeholder="请选择付款方式" :options="options"
:disabled="judgeWrite('paymentMode')" />
</u-form-item>
<u-form-item label="付款金额" prop="receivableMoney" v-if="judgeShow('receivableMoney')"
:required="requiredList.receivableMoney">
<u-input v-model="dataForm.receivableMoney" type="number" placeholder="付款金额"
:disabled="judgeWrite('receivableMoney')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="定金比率" prop="earnestRate" v-if="judgeShow('earnestRate')"
:required="requiredList.earnestRate">
<u-input v-model="dataForm.earnestRate" type="number" placeholder="请输入定金比率"
:disabled="judgeWrite('earnestRate')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="预付定金" prop="prepayEarnest" v-if="judgeShow('prepayEarnest')"
:required="requiredList.prepayEarnest">
<u-input v-model="dataForm.prepayEarnest" type="number" placeholder="请输入预付定金"
:disabled="judgeWrite('prepayEarnest')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="运输方式" prop="transportMode" v-if="judgeShow('transportMode')"
:required="requiredList.transportMode">
<JnpfSelect v-model="dataForm.transportMode" placeholder="请选择运输方式" :options="transportOptions"
:disabled="judgeWrite('transportMode')" />
</u-form-item>
<u-form-item label="发货日期" prop="deliveryDate" v-if="judgeShow('deliveryDate')"
:required="requiredList.deliveryDate">
<JnpfDatePicker format="yyyy-MM-dd" placeholder="请选择发货日期" v-model="dataForm.deliveryDate"
:disabled="judgeWrite('deliveryDate')" />
</u-form-item>
<u-form-item label="发货地址" prop="deliveryAddress" v-if="judgeShow('deliveryAddress')"
:required="requiredList.deliveryAddress">
<u-input v-model="dataForm.deliveryAddress" type="textarea" placeholder="请输入发货地址"
:disabled="judgeWrite('deliveryAddress')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="订单备注" prop="description" v-if="judgeShow('description')"
:required="requiredList.description">
<u-input v-model="dataForm.description" type="textarea" placeholder="请输入订单备注"
:disabled="judgeWrite('description')" input-align="right"></u-input>
</u-form-item>
<!-- #ifndef APP-HARMONY -->
<u-form-item label="相关附件" prop="fileJson" :required="requiredList.fileJson">
<JnpfUploadFile v-model="fileList" :disabled="judgeWrite('fileJson')" />
</u-form-item>
<!-- #endif -->
<!-- #ifdef APP-HARMONY -->
<u-form-item label="相关附件" prop="fileJson" :required="requiredList.fileJson">
<JnpfUploadFileH v-model="fileList" :disabled="judgeWrite('fileJson')" />
</u-form-item>
<!-- #endif -->
</view>
</view>
<view class="jnpf-table" v-if="judgeShow('goodsList')">
<view class="jnpf-table-item-title u-flex u-row-between">
<text class="jnpf-table-item-title-num">商品添购</text>
</view>
<view class="jnpf-table-item" v-for="(item,i) in dataForm.goodsList" :key="i">
<view class="jnpf-table-item-title u-flex u-row-between">
<text class="jnpf-table-item-title-num">({{i+1}})</text>
<view class="jnpf-table-delete-btn" v-if="!judgeWrite('goodsList')" @click="delGoods(i)">
删除
</view>
</view>
<view class="u-p-l-20 u-p-r-20 form-item-box">
<u-form-item label="商品名称" prop="dataForm.goodsList[i].goodsId"
:required="requiredList['goodsList-goodsId']">
<JnpfTreeSelect v-model="dataForm.goodsList[i].goodsId" placeholder="请选择商品名称"
:options="goodsOptions" @change="onGoodsChange($event,i)" :props="props"
:disabled="judgeWrite('goodsList')" />
</u-form-item>
<u-form-item label="规格型号" prop="dataForm.goodsList[i].specifications"
:required="requiredList['goodsList-specifications']">
<u-input v-model="dataForm.goodsList[i].specifications" placeholder="规格型号"
:disabled="judgeWrite('goodsList')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="单位" prop="dataForm.goodsList[i].unit"
:required="requiredList['goodsList-unit']">
<u-input v-model="dataForm.goodsList[i].unit" placeholder="单位"
:disabled="judgeWrite('goodsList')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="数量" prop="dataForm.goodsList[i].qty"
:required="requiredList['goodsList-qty']">
<u-input v-model="dataForm.goodsList[i].qty" placeholder="数量" type="number"
@input="count(i)" :disabled="judgeWrite('goodsList')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="单价" prop="dataForm.goodsList[i].price"
:required="requiredList['goodsList-price']">
<u-input v-model="dataForm.goodsList[i].price" placeholder="单价" type="number"
@input="count(i)" :disabled="judgeWrite('goodsList')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="金额" prop="dataForm.goodsList[i].amount"
:required="requiredList['goodsList-amount']">
<u-input v-model="dataForm.goodsList[i].amount" type="number" placeholder="金额" disabled
input-align="right"></u-input>
</u-form-item>
<u-form-item label="折扣%" prop="dataForm.goodsList[i].discount"
:required="requiredList['goodsList-discount']">
<u-input v-model="dataForm.goodsList[i].discount" placeholder="折扣" type="number"
@input="count(i)" :disabled="judgeWrite('goodsList')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="税率%" prop="dataForm.goodsList[i].cess"
:required="requiredList['goodsList-cess']">
<u-input v-model="dataForm.goodsList[i].cess" placeholder="税率" type="number"
@input="count(i)" :disabled="judgeWrite('goodsList')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="实际单价" prop="dataForm.goodsList[i].actualPrice"
:required="requiredList['goodsList-actualPrice']">
<u-input v-model="dataForm.goodsList[i].actualPrice" placeholder="实际单价" type="number"
disabled input-align="right"></u-input>
</u-form-item>
<u-form-item label="实际金额" prop="dataForm.goodsList[i].actualAmount"
:required="requiredList['goodsList-actualAmount']">
<u-input v-model="dataForm.goodsList[i].actualAmount" type="number" placeholder="实际金额"
disabled input-align="right"></u-input>
</u-form-item>
<u-form-item label="备注" prop="dataForm.goodsList[i].description"
:required="requiredList['goodsList-description']">
<u-input v-model="dataForm.goodsList[i].description" placeholder="备注" type="textarea"
:disabled="judgeWrite('goodsList')" input-align="right"></u-input>
</u-form-item>
</view>
</view>
<view class="jnpf-table-addBtn" @click="addGoods" v-if="!judgeWrite('goodsList')">
<u-icon name="plus" color="#2979ff"></u-icon>商品添购
</view>
</view>
<view class="jnpf-table" v-if="judgeShow('collectionPlanList')">
<view class="jnpf-table-item-title u-flex u-row-between">
<text class="jnpf-table-item-title-num">收款计划</text>
</view>
<view class="jnpf-table-item" v-for="(item,i) in dataForm.collectionPlanList" :key="i">
<view class="jnpf-table-item-title u-flex u-row-between">
<text class="jnpf-table-item-title-num">({{i+1}})</text>
<view class="jnpf-table-delete-btn" v-if="!judgeWrite('collectionPlanList')"
@click="delPlan(i)">删除
</view>
</view>
<view class="u-p-l-20 u-p-r-20 form-item-box">
<u-form-item label="收款日期" prop="dataForm.collectionPlanList[i].receivableDate"
:required="requiredList['collectionPlanList-receivableDate']">
<JnpfDatePicker format="yyyy-MM-dd HH:mm:ss" placeholder="请选择收款日期"
v-model="dataForm.collectionPlanList[i].receivableDate"
:disabled="judgeWrite('collectionPlanList')" />
</u-form-item>
<u-form-item label="收款比率%" prop="dataForm.collectionPlanList[i].receivableRate"
:required="requiredList['collectionPlanList-receivableRate']">
<u-input v-model="dataForm.collectionPlanList[i].receivableRate" placeholder="收款比率"
type="number" :disabled="judgeWrite('collectionPlanList')"
input-align="right"></u-input>
</u-form-item>
<u-form-item label="收款金额" prop="dataForm.collectionPlanList[i].receivableMoney"
:required="requiredList['collectionPlanList-receivableMoney']">
<u-input v-model="dataForm.collectionPlanList[i].receivableMoney" placeholder="收款金额"
type="number" :disabled="judgeWrite('collectionPlanList')"
input-align="right"></u-input>
</u-form-item>
<u-form-item label="收款方式" prop="dataForm.collectionPlanList[i].receivableMode"
:required="requiredList['collectionPlanList-receivableMode']">
<JnpfSelect v-model="dataForm.collectionPlanList[i].receivableMode" placeholder="请选择收款方式"
:options="options" :disabled="judgeWrite('collectionPlanList')" />
</u-form-item>
<u-form-item label="收款摘要" prop="dataForm.collectionPlanList[i].abstract"
:required="requiredList['collectionPlanList-abstract']">
<u-input v-model="dataForm.collectionPlanList[i].abstract" placeholder="收款摘要"
type="textarea" :disabled="judgeWrite('collectionPlanList')" input-align="right">
</u-input>
</u-form-item>
</view>
</view>
<view class="jnpf-table-addBtn" @click="addPlan" v-if="!judgeWrite('collectionPlanList')">
<u-icon name="plus" color="#2979ff"></u-icon>收款计划
</view>
</view>
</u-form>
</view>
</template>
<script>
import comMixin from '../mixin'
import {
getGoodsList,
getCustomerList,
} from '@/api/apply/order'
export default {
name: 'crmOrder',
mixins: [comMixin],
data() {
return {
hide: false,
billEnCode: 'OrderNumber',
dataForm: {
id: '',
customerName: '',
salesmanId: '',
orderDate: undefined,
orderCode: '',
paymentMode: '',
receivableMoney: undefined,
earnestRate: undefined,
prepayEarnest: undefined,
transportMode: '',
deliveryDate: undefined,
deliveryAddress: '',
description: '',
customerId: '',
salesmanName: '',
goodsList: [],
collectionPlanList: [],
fileJson: ''
},
rules: {
customerId: [{
required: true,
message: '客户名称不能为空',
trigger: 'input'
}],
salesmanId: [{
required: true,
message: '业务人员不能为空',
trigger: 'input'
}],
orderDate: [{
required: true,
message: '订单日期不能为空',
trigger: 'change',
type: 'number'
}],
paymentMode: [{
required: true,
message: '付款方式不能为空',
trigger: 'input'
}]
},
options: [{
id: '现金',
fullName: '现金'
}, {
id: '转帐',
fullName: '转帐'
}, {
id: '汇票',
fullName: '汇票'
}],
transportOptions: [{
id: '快递',
fullName: '快递'
}, {
id: '物流',
fullName: '物流'
}, {
id: '配送',
fullName: '配送'
}, {
id: '自提',
fullName: '自提'
}],
props: {
label: 'text',
value: 'id',
children: 'children'
},
goodsOptions: [],
customerOptions: []
}
},
created() {
uni.showLoading({
title: '正在加载.....',
mask: true
});
setTimeout(() => {
this.hide = true
this.initData()
uni.hideLoading()
}, 800)
},
methods: {
initData() {
getGoodsList().then(res => {
this.goodsOptions = res.data.list
})
getCustomerList().then(res => {
this.customerOptions = res.data.list
})
},
onChange(val, e) {
this.dataForm.salesmanName = e.fullName
},
addGoods() {
const item = {
goodsId: '',
goodsCode: '',
goodsName: '',
specifications: '',
unit: '',
qty: undefined,
price: undefined,
amount: '',
discount: undefined,
cess: undefined,
actualPrice: undefined,
actualAmount: undefined,
description: ''
}
this.dataForm.goodsList.push(item)
},
delGoods(index) {
this.dataForm.goodsList.splice(index, 1)
},
addPlan() {
const item = {
receivableDate: undefined,
receivableRate: undefined,
receivableMoney: undefined,
receivableMode: '',
abstract: ''
}
this.dataForm.collectionPlanList.push(item)
},
delPlan(index) {
this.dataForm.collectionPlanList.splice(index, 1)
},
onGoodsChange(e, i) {
const goods = e[0]
this.dataForm.goodsList[i] = {
goodsId: goods.id,
goodsCode: goods.code,
goodsName: goods.text,
specifications: goods.specifications,
unit: goods.unit,
qty: 1,
price: goods.price,
amount: goods.price,
discount: 100,
cess: 0,
actualPrice: goods.price,
actualAmount: goods.price,
description: ''
}
this.$forceUpdate()
},
onCustomerChange(val, e) {
this.dataForm.customerName = e.text
},
count(i) {
this.$nextTick(() => {
const row = this.dataForm.goodsList[i]
//金额 = 数量*单价
row.amount = this.jnpf.toDecimal(parseFloat(row.price) * parseFloat(row.qty))
//折扣价 = (单价*折扣)
var discountPrice = row.price * (row.discount / 100);
//实际单价 = 折扣价 * (1 + (税率 / 100))
row.actualPrice = this.jnpf.toDecimal(discountPrice * (1 + (row.cess / 100)));
//实际金额
row.actualAmount = this.jnpf.toDecimal(parseFloat(row.actualPrice) * parseFloat(row
.qty))
this.$forceUpdate()
})
}
}
}
</script>

View File

@@ -0,0 +1,182 @@
<template>
<view class="jnpf-wrap jnpf-wrap-workflow">
<JnpfParser :formConf="formConf" ref="dynamicForm" v-if="!loading" @submit="sumbitForm" :key="key" />
</view>
</template>
<script>
export default {
props: {
config: {
type: Object,
default: () => {}
},
},
data() {
return {
loading: true,
key: +new Date(),
setting: {},
formConf: {},
formData: {},
eventType: '',
flowUrgent: 1,
dataForm: {
id: '',
flowId: ''
},
isAdd: false,
userInfo: {}
}
},
mounted() {
this.init(this.config)
},
methods: {
init(data) {
this.userInfo = uni.getStorageSync('userInfo') || {}
this.setting = data
this.formConf = data.formConf ? JSON.parse(data.formConf) : {}
this.dataForm.id = data.id || null;
this.dataForm.flowId = data.flowId;
this.loading = true;
this.formData = {};
this.$nextTick(() => {
let extra = {}
if (data.id) {
this.isAdd = false;
extra = {
modelId: data.flowId,
id: this.dataForm.id,
type: data.type,
flowId: data.flowId,
processId: data.id,
opType: data.opType,
taskId: data.taskId
}
uni.setStorageSync('dynamicModelExtra', extra)
const formData = data.draftData || data.formData || {}
this.formData = {
...formData,
flowId: data.flowId
}
} else {
this.isAdd = true;
}
if (data.previewType == 'initiationForm') this.formData = data.formData || {}
this.fillFormData(this.formConf, this.formData)
this.$nextTick(() => {
this.loading = false
})
this.dataForm.flowId = data.flowId
this.key = +new Date()
})
},
fillFormData(form, data) {
form.disabled = this.setting.readonly
const loop = (list, parent) => {
for (let i = 0; i < list.length; i++) {
let item = list[i]
let vModel = item.__vModel__
let config = item.__config__
if (vModel) {
let val = data.hasOwnProperty(vModel) ? data[vModel] : config.defaultValue
if (!config.isSubTable) config.defaultValue = val
if (this.isAdd || config.isSubTable) { //新增时候,默认当前
if (config.defaultCurrent) {
if (config.jnpfKey === 'datePicker') {
if (!data.hasOwnProperty(vModel)) {
let format = this.jnpf.handelFormat(item.format)
let dateStr = this.jnpf.toDate(new Date().getTime(), format)
let time = format === 'yyyy' ? '-01-01 00:00:00' : format === 'yyyy-MM' ?
'-01 00:00:00' : format === 'yyyy-MM-dd' ?
' 00:00:00' : ''
val = new Date(dateStr + time).getTime()
config.defaultValue = val
}
}
if (config.jnpfKey === 'timePicker') {
if (!data.hasOwnProperty(vModel)) {
config.defaultValue = this.jnpf.toDate(new Date(), item.format)
}
}
if (config.jnpfKey === 'organizeSelect' && this.userInfo.organizeIds?.length) {
config.defaultValue = item.multiple ? this.userInfo.organizeIds :
this.userInfo.organizeId
}
if (config.jnpfKey === 'posSelect' && this.userInfo.positionIds?.length) {
config.defaultValue = item.multiple ? this.userInfo.positionIds :
this.userInfo.positionId
}
const userId = this.userInfo.userId
if (config.jnpfKey === 'userSelect' && userId) {
config.defaultValue = item.multiple ? [userId] : userId;
}
if (config.jnpfKey === 'usersSelect' && userId) {
config.defaultValue = [userId + '--user'];
}
if (config.jnpfKey === 'sign' && this.userInfo.signImg) {
config.defaultValue = this.userInfo.signImg
}
}
}
let noShow = item.__config__.noShow || false,
isDisabled = item.disabled || false,
required = item.__config__.required || false,
isVisibility = false
if (!item.__config__.visibility || (Array.isArray(item.__config__.visibility) && item
.__config__.visibility.includes('app'))) isVisibility = true
if (this.setting.formOperates && this.setting.formOperates.length) {
let id = item.__config__.isSubTable ? parent?.__vModel__ + '-' + item?.__vModel__ :
item
.__vModel__
let arr = this.setting.formOperates.filter(o => o.id === id) || []
if (arr.length) {
let obj = arr[0]
noShow = !obj.read
isDisabled = !obj.write
required = obj.required ? obj.required : item.__config__.required
}
}
isDisabled = item.readonly ? item.readonly : isDisabled;
if (this.setting.readonly || config.disabled) isDisabled = true
if (this.setting.origin === 'scan') isDisabled = true
this.$set(item, 'disabled', isDisabled)
this.$set(item.__config__, 'noShow', noShow)
this.$set(item.__config__, 'required', required)
this.$set(item.__config__, 'isVisibility', isVisibility)
} else {
let noShow = item.__config__.noShow ? item.__config__.noShow : false,
isVisibility = false
if (!item.__config__.visibility || (Array.isArray(item.__config__.visibility) && item
.__config__.visibility.includes('app'))) isVisibility = true
this.$set(item.__config__, 'isVisibility', isVisibility)
this.$set(item.__config__, 'noShow', noShow)
}
if (item.__config__ && item.__config__.children && Array.isArray(item.__config__.children)) {
loop(item.__config__.children, item)
}
}
}
loop(form.fields)
form.formData = data
},
sumbitForm(data, callback) {
if (!data) return
const formData = {
...this.formData,
...data
}
this.dataForm.formData = formData
if (callback && typeof callback === "function") callback()
this.$emit('eventReceiver', this.dataForm, this.eventType)
},
submit(eventType, flowUrgent) {
if (this.setting.isPreview == '1') return this.$u.toast('功能预览不支持数据保存')
this.eventType = eventType
this.flowUrgent = flowUrgent
this.$refs.dynamicForm && this.$refs.dynamicForm.submitForm()
},
}
}
</script>

View File

@@ -0,0 +1,221 @@
<template>
<view class="jnpf-wrap jnpf-wrap-workflow">
<u-form :model="dataForm" :rules="rules" ref="dataForm" :errorType="['toast']" label-position="left"
label-width="150" label-align="left">
<view class="u-p-l-20 u-p-r-20 form-item-box">
<u-form-item label="流程标题" prop="flowTitle" :required="requiredList.flowTitle"
v-if="judgeShow('flowTitle')">
<u-input v-model="dataForm.flowTitle" placeholder="流程标题" :disabled="judgeWrite('flowTitle')"
input-align="right"></u-input>
</u-form-item>
<u-form-item label="流程编码" prop="billNo" v-if="judgeShow('billNo')" :required="requiredList.billNo">
<u-input v-model="dataForm.billNo" placeholder="流程编码" disabled input-align="right"></u-input>
</u-form-item>
</view>
<view class="jnpf-card">
<view class="u-p-l-20 u-p-r-20 form-item-box">
<u-form-item label="申请人员" prop="applyUser" v-if="judgeShow('applyUser')"
:required="requiredList.applyUser">
<u-input v-model="dataForm.applyUser" placeholder="请输入申请人员" :disabled="judgeWrite('applyUser')"
input-align="right">
</u-input>
</u-form-item>
<u-form-item label="申请部门" prop="applyDept" v-if="judgeShow('applyDept')"
:required="requiredList.applyDept">
<u-input v-model="dataForm.applyDept" placeholder="请输入申请部门" :disabled="judgeWrite('applyDept')"
input-align="right">
</u-input>
</u-form-item>
<u-form-item label="申请职位" prop="applyPost" v-if="judgeShow('applyPost')"
:required="requiredList.applyPost">
<u-input v-model="dataForm.applyPost" placeholder="请输入申请职位" :disabled="judgeWrite('applyPost')"
input-align="right">
</u-input>
</u-form-item>
<u-form-item label="申请日期" prop="applyDate" v-if="judgeShow('applyDate')"
:required="requiredList.applyDate">
<JnpfDatePicker v-model="dataForm.applyDate" placeholder="请输入申请日期"
:disabled="judgeWrite('applyDate')" />
</u-form-item>
<u-form-item label="请假类别" prop="leaveType" v-if="judgeShow('leaveType')"
:required="requiredList.leaveType">
<JnpfSelect v-model="dataForm.leaveType" placeholder="请选择请假类别" :options="leaveTypeList"
:disabled="judgeWrite('leaveType')" />
</u-form-item>
<u-form-item label="请假原因" prop="leaveReason" v-if="judgeShow('leaveReason')"
:required="requiredList.leaveReason">
<u-input v-model="dataForm.leaveReason" placeholder="请输入请假原因" type="textarea"
:disabled="judgeWrite('leaveReason')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="起始时间" prop="leaveStartTime" v-if="judgeShow('leaveStartTime')"
:required="requiredList.leaveStartTime">
<JnpfDatePicker format="yyyy-MM-dd HH:mm:ss" v-model="dataForm.leaveStartTime"
placeholder="请选择起始时间" :disabled="judgeWrite('leaveStartTime')" />
</u-form-item>
<u-form-item label="结束时间" prop="leaveEndTime" v-if="judgeShow('leaveEndTime')"
:required="requiredList.leaveEndTime">
<JnpfDatePicker format="yyyy-MM-dd HH:mm:ss" v-model="dataForm.leaveEndTime"
placeholder="请选择结束时间" :disabled="judgeWrite('leaveEndTime')" />
</u-form-item>
<u-form-item label="请假天数" prop="leaveDayCount" v-if="judgeShow('leaveDayCount')"
:required="requiredList.leaveDayCount">
<u-input v-model="dataForm.leaveDayCount" placeholder="请输入请假天数"
:disabled="judgeWrite('leaveDayCount')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="请假小时" prop="leaveHour" v-if="judgeShow('leaveHour')"
:required="requiredList.leaveHour">
<u-input v-model="dataForm.leaveHour" placeholder="请输入请假小时" type="number"
:disabled="judgeWrite('leaveHour')" input-align="right"></u-input>
</u-form-item>
<!-- #ifndef APP-HARMONY -->
<u-form-item label="相关附件" prop="fileJson" v-if="judgeShow('fileJson')"
:required="requiredList.fileJson">
<JnpfUploadFile v-model="fileList" :disabled="judgeWrite('fileJson')" />
</u-form-item>
<!-- #endif -->
<!-- #ifdef APP-HARMONY -->
<u-form-item label="相关附件" prop="fileJson" v-if="judgeShow('fileJson')"
:required="requiredList.fileJson">
<JnpfUploadFileH v-model="fileList" :disabled="judgeWrite('fileJson')" />
</u-form-item>
<!-- #endif -->
</view>
</view>
</u-form>
</view>
</template>
<script>
import comMixin from '../mixin'
export default {
name: 'LeaveApply',
mixins: [comMixin],
data() {
return {
billEnCode: 'WF_LeaveApplyNo',
dataForm: {
flowTitle: '',
billNo: '',
flowUrgent: 1,
applyUser: '',
leaveHour: '',
applyDept: '',
leaveStartTime: '',
leaveEndTime: '',
leaveDayCount: '',
leaveReason: '',
applyDate: '',
leaveType: '',
fileJson: '',
applyPost: '',
description: ''
},
rules: {
flowTitle: [{
required: true,
message: '流程标题不能为空',
trigger: 'blur'
}],
flowUrgent: [{
required: true,
message: '紧急程度不能为空',
trigger: 'change',
type: 'number'
}],
billNo: [{
required: true,
message: '流程编码不能为空',
trigger: 'blur',
}],
leaveHour: [{
required: true,
message: '请假小时不能为空',
trigger: 'blur',
}],
leaveStartTime: [{
required: true,
message: '起始时间不能为空',
trigger: 'blur',
type: 'number'
}],
leaveDayCount: [{
required: true,
message: '请假天数不能为空',
trigger: 'blur',
}],
leaveEndTime: [{
required: true,
message: '结束时间不能为空',
trigger: 'blur',
type: 'number'
}],
leaveReason: [{
required: true,
message: '请假原因不能为空',
trigger: 'blur',
type: 'string'
}],
},
leaveTypeList: [{
fullName: '事假',
id: '事假',
checked: false
},
{
fullName: '病假',
id: '病假',
checked: false
},
{
fullName: '婚假',
id: '婚假',
checked: false
},
{
fullName: '产假',
id: '产假',
checked: false
},
{
fullName: '丧假',
id: '丧假',
checked: false
},
{
fullName: '年假',
id: '年假',
checked: false
},
{
fullName: '调休',
id: '调休',
checked: false
},
{
fullName: '其他',
id: '其他',
checked: false
},
],
}
},
methods: {
selfInit(data) {
this.dataForm.applyDate = new Date().getTime()
this.dataForm.flowTitle = this.userInfo.userName + "的请假申请表"
this.dataForm.applyUser = this.userInfo.userName + '/' + this.userInfo.userAccount
this.dataForm.applyDept = this.userInfo.organizeName
if (this.userInfo?.positionList?.length) {
const list = this.userInfo.positionList.map(o => o.treeName)
this.dataForm.applyPost = list.join(',')
}
},
}
}
</script>
<style>
</style>

View File

@@ -0,0 +1,226 @@
import {
getBillNumber
} from '@/api/common'
const includeList = ['crmOrder', 'salesOrder', 'leaveApply']
export default {
props: {
config: {
type: Object,
default: () => {}
},
},
data() {
return {
flowUrgentOptions: [{
id: 1,
fullName: '普通'
}, {
id: 2,
fullName: '重要'
}, {
id: 3,
fullName: '紧急'
}],
fileList: [],
setting: {},
userInfo: {},
eventType: '',
paymentMethodOptions: [],
requiredList: {},
requiredObj: []
}
},
mounted() {
this.init(this.config)
this.$refs.dataForm.setRules(this.rules)
this.userInfo = uni.getStorageSync('userInfo') || {}
},
methods: {
checkChildRule() {
let list = {}
this.requiredObj.forEach((data) => {
if (data.required) {
list[data.id] = data.name + '不能为空'
}
})
let title = [];
for (let k in list) {
let num = k.split("-");
let childKey = num[0];
num.forEach((model, i) => {
if (i == 1) {
let childData = this.dataForm[childKey]
childData.forEach((child, i) => {
if (child[model] instanceof Array) {
if (child[model].length == 0) {
title.push(list[childKey + "-" + model])
}
} else {
if (!child[model] && child[model] !== 0) {
title.push(list[childKey + "-" + model])
}
}
})
}
})
}
let _regList = this.regList
for (let k in _regList) {
let childData = this.dataForm[k]
for (let n in _regList[k]) {
for (let i = 0; i < _regList[k][n].length; i++) {
const element = _regList[k][n][i]
if (element.pattern) {
element.pattern = element.pattern.toString()
let start = element.pattern.indexOf('/')
let stop = element.pattern.lastIndexOf('/')
let str = element.pattern.substring(start + 1, stop)
let reg = new RegExp(str)
element.pattern = reg
}
childData.forEach((item, index) => {
if (item[n] && !element.pattern.test(item[n])) {
title.push(element.message)
}
})
}
}
}
if (title.length > 0) {
return title[0]
}
},
/* 初始化处理 */
init(data) {
this.dataForm.id = data.id || ''
this.dataForm.flowId = data.flowId
this.setting = data
if (data.formEnCode !== "revoke") this.updateDataRule()
this.$nextTick(() => {
this.$refs.dataForm.resetFields()
if (this.beforeInit) this.beforeInit()
if (data.id) {
let dataForm = JSON.parse(JSON.stringify(data.draftData)) || JSON.parse(JSON.stringify(data
.formData))
if (this.selfGetInfo && typeof this.selfGetInfo === "function") {
this.selfGetInfo(dataForm)
} else {
this.dataForm = JSON.parse(JSON.stringify(dataForm))
}
if (includeList.includes(data.formEnCode) && this.dataForm.fileJson) {
this.fileList = JSON.parse(this.dataForm.fileJson)
}
return
} else {
if (this.selfInit) this.selfInit(data)
if (!this.billEnCode) return
getBillNumber(this.billEnCode).then(res => {
if (data.formEnCode === 'crmOrder') {
this.dataForm.orderCode = res.data
} else {
this.dataForm.billNo = res.data
}
})
}
})
},
/* 提交 */
submit(eventType, flowUrgent) {
this.eventType = eventType
this.$refs.dataForm.setRules(this.rules)
this.$refs.dataForm.validate((valid) => {
if (valid) {
if (includeList.includes(this.setting.formEnCode)) {
this.dataForm.fileJson = !!this.fileList.length ? JSON.stringify(this.fileList) : ''
}
if (!!this.checkChildRule()) return this.$u.toast(`${this.checkChildRule()}`)
if (this.exist && !!this.exist()) return this.$u.toast(`${this.exist()}`)
let dataForm = {}
if (this.beforeSubmit && typeof this.beforeSubmit === "function") {
dataForm = this.beforeSubmit()
} else {
dataForm = this.dataForm
}
if (includeList.includes(this.setting.formEnCode)) {
dataForm.fileJson = JSON.stringify(this.fileList)
}
if (eventType === 'save' || eventType === 'submit') {
if (this.selfSubmit && typeof this.selfSubmit === "function") {
this.selfSubmit(this.dataForm, flowUrgent)
return
}
}
this.$emit('eventReceiver', {
formData: dataForm,
id: this.dataForm.id
}, eventType)
}
})
},
updateDataRule() {
let newRules = {}
for (let i = 0; i < this.setting.formOperates.length; i++) {
const item = this.setting.formOperates[i]
if (item.required) {
this.$set(this.requiredList, item.id, item.required)
if (item.jnpfKey != 'rate' && item.jnpfKey != 'slider') this.requiredObj.push(item)
}
const newRulesItem = {
required: item.required || false,
message: item.name + '不能为空',
trigger: item.trigger || ['blur', 'change'],
type: ''
}
const numList = ['inputNumber', 'datePicker', 'switch', 'rate', 'slider']
if (item.dataType === 'array') newRulesItem.type = item.dataType
if (numList.includes(item.jnpfKey)) newRulesItem.type = 'number'
if (['relationForm', 'popupSelect'].includes(item.jnpfKey)) {
newRulesItem.type = 'any',
newRulesItem.validator = (rule, value, callback) => {
if (value || value === 0) {
callback();
} else {
callback(new Error(item.name + '不能为空'));
}
}
}
if (!this.rules.hasOwnProperty(item.id)) {
if (item.required) this.$set(newRules, item.id, [newRulesItem])
} else {
let withoutRequiredItem = true
for (let i = 0; i < this.rules[item.id].length; i++) {
if (this.rules[item.id][i].hasOwnProperty('required')) {
this.rules[item.id][i].required = item.required || false
withoutRequiredItem = false
}
}
if (withoutRequiredItem && item.required) this.rules[item.id].push(newRulesItem)
}
}
this.rules = {
...this.rules,
...newRules
}
this.$refs.dataForm.setRules(this.rules)
},
/* 可见 */
judgeShow(id) {
if (this.setting.opType == 4) return true
if (!this.setting.formOperates || !this.setting.formOperates.length) return true
let arr = this.setting.formOperates.filter(o => o.id === id) || []
if (!arr.length) return true
let item = arr[0]
return item.read
},
/* 可写 */
judgeWrite(id) {
if (this.setting.readonly) return true
if (!this.setting.formOperates || !this.setting.formOperates.length) return false
let arr = this.setting.formOperates.filter(o => o.id === id) || []
if (!arr.length) return true
let item = arr[0]
return !item.write
}
}
}

View File

@@ -0,0 +1,70 @@
<template>
<view class="jnpf-wrap jnpf-wrap-workflow">
<u-form :model="dataForm" ref="dataForm" :errorType="['toast']" label-position="left" label-width="150"
label-align="left">
<view class="u-p-l-20 u-p-r-20 form-item-box">
<u-form-item label="审批编号" prop="billRule">
<u-input v-model="dataForm.billRule" placeholder="审批编号" disabled input-align="right"></u-input>
</u-form-item>
<u-form-item label="提交日期" prop="creatorTime">
<JnpfDatePicker v-model="dataForm.creatorTime" placeholder="请输入提交日期" disabled />
</u-form-item>
<u-form-item label="撤销理由" prop="handleOpinion">
<u-input v-model="dataForm.handleOpinion" placeholder="请输入撤销理由" type="textarea" disabled
input-align="right"></u-input>
</u-form-item>
<u-form-item label="关联流程" prop="revokeFlow">
<view class="jnpf-link" @click="openRevokeFlow()">
<text>{{dataForm.revokeTaskName}}</text>
</view>
</u-form-item>
</view>
</u-form>
</view>
</template>
<script>
import comMixin from '../mixin'
import {
FlowTask
} from '@/api/workFlow/flowBefore'
export default {
name: 'revoke',
mixins: [comMixin],
data() {
return {
dataForm: {
billRule: '',
creatorTime: '',
handleOpinion: '',
revokeTaskId: '',
revokeTaskName: ''
}
}
},
methods: {
/* 打开关联流程 */
openRevokeFlow() {
const query = {
opType: 5,
id: this.dataForm.revokeTaskId
};
uni.navigateTo({
url: '/pages/workFlow/flowBefore/revokeForm?config=' + this.jnpf.base64.encode(JSON.stringify(
query))
})
},
selfInit(data) {
this.dataForm.flowTitle = this.userInfo.userName + "的撤销申请表"
}
}
}
</script>
<style>
.jnpf-link {
width: 100%;
color: #1890ff;
text-align: right;
}
</style>

View File

@@ -0,0 +1,265 @@
<template>
<view class="jnpf-wrap jnpf-wrap-workflow">
<u-form :model="dataForm" :rules="rules" ref="dataForm" :errorType="['toast']" label-position="left"
label-width="150" label-align="left">
<view class="u-p-l-20 u-p-r-20 form-item-box">
<u-form-item label="流程标题" prop="flowTitle" :required="requiredList.flowTitle"
v-if="judgeShow('flowTitle')">
<u-input v-model="dataForm.flowTitle" placeholder="流程标题" :disabled="judgeWrite('flowTitle')"
input-align="right"></u-input>
</u-form-item>
<u-form-item label="流程编码" prop="billNo" v-if="judgeShow('billNo')" :required="requiredList.billNo">
<u-input v-model="dataForm.billNo" placeholder="流程编码" disabled input-align="right"></u-input>
</u-form-item>
</view>
<view class="jnpf-card">
<view class="u-p-l-20 u-p-r-20 form-item-box">
<u-form-item label="客户名称" prop="customerName" v-if="judgeShow('customerName')"
:required="requiredList.customerName">
<u-input v-model="dataForm.customerName" placeholder="请输入客户名称"
:disabled="judgeWrite('customerName')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="联系人员" prop="contacts" v-if="judgeShow('contacts')"
:required="requiredList.contacts">
<u-input v-model="dataForm.contacts" placeholder="请输入联系人员" :disabled="judgeWrite('contacts')"
input-align="right">
</u-input>
</u-form-item>
<u-form-item label="开单日期" prop="salesDate" v-if="judgeShow('salesDate')"
:required="requiredList.salesDate">
<JnpfDatePicker type="datetime" v-model="dataForm.salesDate" placeholder="请输入开单日期"
:disabled="judgeWrite('salesDate')" />
</u-form-item>
<u-form-item label="联系电话" prop="contactPhone" v-if="judgeShow('contactPhone')"
:required="requiredList.contactPhone">
<u-input v-model="dataForm.contactPhone" placeholder="请输入联系电话"
:disabled="judgeWrite('contactPhone')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="客户地址" prop="customerAddres" v-if="judgeShow('customerAddres')"
:required="requiredList.customerAddres">
<u-input v-model="dataForm.customerAddres" placeholder="输入送客户地址"
:disabled="judgeWrite('customerAddres')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="业务人员" prop="salesman" v-if="judgeShow('salesman')"
:required="requiredList.salesman">
<u-input v-model="dataForm.salesman" placeholder="输入业务人员" :disabled="judgeWrite('salesman')"
input-align="right">
</u-input>
</u-form-item>
<u-form-item label="发票编号" prop="ticketNum" v-if="judgeShow('ticketNum')"
:required="requiredList.ticketNum">
<u-input v-model="dataForm.ticketNum" placeholder="输入发票编号" :disabled="judgeWrite('ticketNum')"
input-align="right">
</u-input>
</u-form-item>
<u-form-item label="发票类型" prop="invoiceType" v-if="judgeShow('invoiceType')"
:required="requiredList.invoiceType">
<JnpfSelect v-model="dataForm.invoiceType" placeholder="请选择发票类型" :options="invoiceTypeList"
:disabled="judgeWrite('invoiceType')" />
</u-form-item>
<u-form-item label="付款方式" prop="paymentMethod" v-if="judgeShow('paymentMethod')"
:required="requiredList.paymentMethod">
<u-input v-model="dataForm.paymentMethod" placeholder="请输入付款方式" input-align="right"
:disabled="judgeWrite('paymentMethod')">
</u-input>
</u-form-item>
<u-form-item label="付款金额" prop="paymentMoney" v-if="judgeShow('paymentMoney')"
:required="requiredList.paymentMoney">
<u-input v-model="dataForm.paymentMoney" placeholder="输入付款金额"
:disabled="judgeWrite('paymentMoney')" input-align="right"></u-input>
</u-form-item>
<!-- #ifndef APP-HARMONY -->
<u-form-item label="相关附件" prop="fileJson" v-if="judgeShow('fileJson')"
:required="requiredList.fileJson">
<JnpfUploadFile v-model="fileList" :disabled="judgeWrite('fileJson')" />
</u-form-item>
<!-- #endif -->
<!-- #ifdef APP-HARMONY -->
<u-form-item label="相关附件" prop="fileJson" v-if="judgeShow('fileJson')"
:required="requiredList.fileJson">
<JnpfUploadFileH v-model="fileList" :disabled="judgeWrite('fileJson')" />
</u-form-item>
<!-- #endif -->
<u-form-item label="开单备注" prop="description" v-if="judgeShow('description')"
:required="requiredList.description">
<u-input v-model="dataForm.description" placeholder="输入开单备注" type="textarea"
:disabled="judgeWrite('description')" input-align="right"></u-input>
</u-form-item>
</view>
</view>
<view class="jnpf-table" v-if="judgeShow('entryList')">
<view class="jnpf-table-item-title u-flex u-row-between">
<text class="jnpf-table-item-title-num">销售明细</text>
</view>
<view class="jnpf-table-item" v-for="(item,i) in dataForm.entryList" :key="i">
<view class="jnpf-table-item-title u-flex u-row-between">
<text class="jnpf-table-item-title-num">({{i+1}})</text>
<view class="jnpf-table-delete-btn" v-if="!judgeWrite('entryList')" @click="delItem(i)">
删除
</view>
</view>
<view class="u-p-l-20 u-p-r-20 form-item-box">
<u-form-item label="商品名称" prop="dataForm.entryList[i].goodsName"
v-if="judgeShow('entryList-goodsName')" :required="requiredList['entryList-goodsName']">
<u-input v-model="dataForm.entryList[i].goodsName" placeholder="请输入商品名称"
:disabled="judgeWrite('entryList-goodsName')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="规格类型" prop="dataForm.entryList[i].specifications"
v-if="judgeShow('entryList-specifications')"
:required="requiredList['entryList-specifications']">
<u-input v-model="dataForm.entryList[i].specifications" placeholder="请输入规格类型"
:disabled="judgeWrite('entryList-specifications')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="单位" prop="dataForm.entryList[i].unit" v-if="judgeShow('entryList-unit')"
:required="requiredList['entryList-unit']">
<u-input v-model="dataForm.entryList[i].unit" placeholder="请输入单位"
:disabled="judgeWrite('entryList-unit')" input-align="right"></u-input>
</u-form-item>
<u-form-item label="数量" prop="dataForm.entryList[i].qty" v-if="judgeShow('entryList-qty')"
:required="requiredList['entryList-qty']">
<u-input v-model="dataForm.entryList[i].qty" placeholder="请输入数量" type="number"
input-align="right" @input="count(dataForm.entryList[i])"
:disabled="judgeWrite('entryList-qty')"></u-input>
</u-form-item>
<u-form-item label="单价" prop="dataForm.entryList[i].price" v-if="judgeShow('entryList-price')"
:required="requiredList['entryList-price']">
<u-input v-model="dataForm.entryList[i].price" placeholder="请输入单价" type="number"
@input="count(dataForm.entryList[i])" input-align="right"
:disabled="judgeWrite('entryList-price')"></u-input>
</u-form-item>
<u-form-item label="金额" prop="dataForm.entryList[i].amount" v-if="judgeShow('entryList-amount')"
:required="requiredList['entryList-amount']">
<u-input v-model="dataForm.entryList[i].amount" type="number" placeholder="请输入金额" disabled
input-align="right"></u-input>
</u-form-item>
<u-form-item label="备注" prop="dataForm.entryList[i].description"
v-if="judgeShow('entryList-description')" :required="requiredList['entryList-description']">
<u-input v-model="dataForm.entryList[i].description" placeholder="请输入备注" type="textarea"
:disabled="judgeWrite('entryList-description')" input-align="right"></u-input>
</u-form-item>
</view>
</view>
<view class="jnpf-table-addBtn" @click="addItem" v-if="!judgeWrite('entryList')">
<u-icon name="plus" color="#2979ff"></u-icon>添加
</view>
</view>
</u-form>
</view>
</template>
<script>
import comMixin from '../mixin'
export default {
name: 'SalesOrder',
mixins: [comMixin],
data() {
return {
billEnCode: 'WF_SalesOrderNo',
dataForm: {
flowTitle: '',
billNo: '',
flowUrgent: 1,
customerAddres: '',
contactPhone: '',
description: '',
fileJson: '',
salesman: '',
paymentMoney: undefined,
paymentMethod: '',
invoiceType: '',
salesDate: undefined,
contacts: '',
customerName: '',
entryList: []
},
invoiceTypeList: [{
fullName: "普通发票",
id: "普通发票",
checked: false
},
{
fullName: "专业发票",
id: "专业发票",
checked: false
},
{
fullName: "其他",
id: "其他",
checked: false
}
],
rules: {
flowTitle: [{
required: true,
message: '流程标题不能为空',
trigger: 'blur'
}],
flowUrgent: [{
required: true,
message: '紧急程度不能为空',
trigger: 'change',
type: 'number'
}],
billNo: [{
required: true,
message: '流程编码不能为空',
trigger: 'blur',
}],
salesDate: [{
required: true,
message: '开单日期不能为空',
trigger: 'change',
type: 'number'
}]
},
}
},
methods: {
selfInit(data) {
this.dataForm.flowTitle = this.userInfo.userName + "的销售订单";
},
/* 添加子表 */
addItem() {
const item = {
goodsName: '',
specifications: '',
unit: '',
qty: undefined,
price: undefined,
amount: undefined,
description: ''
}
this.dataForm.entryList.push(item)
},
/* 删除子表 */
delItem(index) {
uni.showModal({
title: '提示',
content: '确定删除销售明细(' + (index + 1) + ')?',
success: (res) => {
if (res.confirm) {
this.dataForm.entryList.splice(index, 1)
}
}
})
},
/* 计算价格 */
count(row) {
//金额 = 数量*单价
row.amount = this.jnpf.toDecimal(parseFloat(row.price) * parseFloat(row.qty))
//折扣价 = (单价*折扣)
var discountPrice = row.price * (row.discount / 100);
//实际单价 = 折扣价 * (1 + (税率 / 100))
row.actualPrice = this.jnpf.toDecimal(discountPrice * (1 + (row.cess / 100)));
//实际金额
row.actualAmount = this.jnpf.toDecimal(parseFloat(row.actualPrice) * parseFloat(row
.qty))
this.$forceUpdate()
},
}
}
</script>
<style>
</style>