main
parent
2dcdb0a1c3
commit
7e46121079
4
.env
4
.env
|
|
@ -1,5 +1 @@
|
|||
|
||||
|
||||
VITE_COMMON_API_PREFIX = /api-base
|
||||
|
||||
VITE_COMMON_API_URL = http://store-manage.hmily.club
|
||||
|
|
|
|||
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
VITE_COMMON_API_PREFIX = /api-base
|
||||
|
||||
VITE_COMMON_API_URL = http://store-manage.hmily.club
|
||||
|
|
@ -1,3 +1,3 @@
|
|||
VITE_COMMON_API_PREFIX = /api
|
||||
|
||||
VITE_COMMON_API_URL = http://store-manage.hmily.club
|
||||
VITE_COMMON_API_URL = http://store-manage.hmily.club/api
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
|
||||
// launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
|
||||
"version": "0.0",
|
||||
"configurations": [{
|
||||
"app-plus" :
|
||||
{
|
||||
"launchtype" : "local"
|
||||
},
|
||||
"default" :
|
||||
{
|
||||
"launchtype" : "local"
|
||||
},
|
||||
"type" : "uniCloud"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -24,6 +24,8 @@
|
|||
"@dcloudio/uni-mp-xhs": "3.0.0-3090920231225001",
|
||||
"@dcloudio/uni-quickapp-webview": "3.0.0-3090920231225001",
|
||||
"@qiun/ucharts": "^2.5.0-20230101",
|
||||
"esbuild-darwin-arm64": "^0.15.18",
|
||||
"luch-request": "^3.1.1",
|
||||
"pinia": "2.0.33",
|
||||
"pinia-plugin-persistedstate": "^3.2.1",
|
||||
"vue": "^3.2.45",
|
||||
|
|
@ -6280,6 +6282,20 @@
|
|||
"@esbuild/win32-x64": "0.16.17"
|
||||
}
|
||||
},
|
||||
"node_modules/esbuild-darwin-arm64": {
|
||||
"version": "0.15.18",
|
||||
"resolved": "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz",
|
||||
"integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/escalade": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz",
|
||||
|
|
@ -9412,6 +9428,19 @@
|
|||
"yallist": "^3.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/luch-request": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmmirror.com/luch-request/-/luch-request-3.1.1.tgz",
|
||||
"integrity": "sha512-p7+mlcEtgRcd0OfXC4XZbyiwSr1XgCeqNT7LlVUjnk7InYl/8d5Rk7BUqAYNA2WRafI1wRIUQWRWZRpeUwWR0w==",
|
||||
"dependencies": {
|
||||
"@dcloudio/types": "^2.0.16"
|
||||
}
|
||||
},
|
||||
"node_modules/luch-request/node_modules/@dcloudio/types": {
|
||||
"version": "2.6.12",
|
||||
"resolved": "https://registry.npmmirror.com/@dcloudio/types/-/types-2.6.12.tgz",
|
||||
"integrity": "sha512-mrCMwcINy1IFjU9VUqLeWBkj404yWs5paLDttBcA+eqUjanuUQbBcTVPqlrGgkyzLXDcV2oDDZRSNxNpXi4kMQ=="
|
||||
},
|
||||
"node_modules/magic-string": {
|
||||
"version": "0.30.8",
|
||||
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.8.tgz",
|
||||
|
|
@ -17044,6 +17073,11 @@
|
|||
"@esbuild/win32-x64": "0.16.17"
|
||||
}
|
||||
},
|
||||
"esbuild-darwin-arm64": {
|
||||
"version": "0.15.18",
|
||||
"resolved": "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz",
|
||||
"integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA=="
|
||||
},
|
||||
"escalade": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz",
|
||||
|
|
@ -19445,6 +19479,21 @@
|
|||
"yallist": "^3.0.2"
|
||||
}
|
||||
},
|
||||
"luch-request": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmmirror.com/luch-request/-/luch-request-3.1.1.tgz",
|
||||
"integrity": "sha512-p7+mlcEtgRcd0OfXC4XZbyiwSr1XgCeqNT7LlVUjnk7InYl/8d5Rk7BUqAYNA2WRafI1wRIUQWRWZRpeUwWR0w==",
|
||||
"requires": {
|
||||
"@dcloudio/types": "^2.0.16"
|
||||
},
|
||||
"dependencies": {
|
||||
"@dcloudio/types": {
|
||||
"version": "2.6.12",
|
||||
"resolved": "https://registry.npmmirror.com/@dcloudio/types/-/types-2.6.12.tgz",
|
||||
"integrity": "sha512-mrCMwcINy1IFjU9VUqLeWBkj404yWs5paLDttBcA+eqUjanuUQbBcTVPqlrGgkyzLXDcV2oDDZRSNxNpXi4kMQ=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"magic-string": {
|
||||
"version": "0.30.8",
|
||||
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.8.tgz",
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@
|
|||
"@dcloudio/uni-mp-xhs": "3.0.0-3090920231225001",
|
||||
"@dcloudio/uni-quickapp-webview": "3.0.0-3090920231225001",
|
||||
"@qiun/ucharts": "^2.5.0-20230101",
|
||||
"esbuild-darwin-arm64": "^0.15.18",
|
||||
"luch-request": "^3.1.1",
|
||||
"pinia": "2.0.33",
|
||||
"pinia-plugin-persistedstate": "^3.2.1",
|
||||
|
|
|
|||
12
src/App.vue
12
src/App.vue
|
|
@ -1,7 +1,17 @@
|
|||
<script>
|
||||
// import { useUserStoreWithOut } from "@/store/modules/user";
|
||||
import { useUserStoreWithOut } from '@/store/modules/user'
|
||||
export default {
|
||||
onLaunch: function () {
|
||||
const userStore = useUserStoreWithOut()
|
||||
|
||||
if (userStore.isLogin) {
|
||||
userStore.fetchUserInfo()
|
||||
} else {
|
||||
uni.navigateTo({
|
||||
url: '/pages/login/index',
|
||||
})
|
||||
}
|
||||
|
||||
console.log('App Launch')
|
||||
},
|
||||
onShow: function () {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name" : "",
|
||||
"appid" : "",
|
||||
"name" : "aa",
|
||||
"appid" : "__UNI__ADB6360",
|
||||
"description" : "",
|
||||
"versionName" : "1.0.0",
|
||||
"versionCode" : "100",
|
||||
|
|
@ -41,9 +41,13 @@
|
|||
]
|
||||
},
|
||||
/* ios打包配置 */
|
||||
"ios" : {},
|
||||
"ios" : {
|
||||
"dSYMs" : false
|
||||
},
|
||||
/* SDK配置 */
|
||||
"sdkConfigs" : {}
|
||||
"sdkConfigs" : {
|
||||
"ad" : {}
|
||||
}
|
||||
}
|
||||
},
|
||||
/* 快应用特有相关 */
|
||||
|
|
@ -65,8 +69,8 @@
|
|||
"mp-toutiao" : {
|
||||
"usingComponents" : true
|
||||
},
|
||||
"uniStatistics": {
|
||||
"enable": false
|
||||
"uniStatistics" : {
|
||||
"enable" : false
|
||||
},
|
||||
"vueVersion" : "3"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,17 +1,18 @@
|
|||
{
|
||||
"pages": [
|
||||
{
|
||||
"path": "pages/login/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "登录"
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
"path": "pages/home/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "首页"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/login/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "登录"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/revert/index",
|
||||
"style": {
|
||||
|
|
@ -296,7 +297,8 @@
|
|||
}
|
||||
}
|
||||
]
|
||||
},{
|
||||
},
|
||||
{
|
||||
"root": "pages/train-books",
|
||||
"pages": [
|
||||
{
|
||||
|
|
@ -329,6 +331,17 @@
|
|||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"root": "pages/audits",
|
||||
"pages": [
|
||||
{
|
||||
"path": "detail",
|
||||
"style": {
|
||||
"navigationBarTitleText": "审核详情"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"globalStyle": {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,59 @@
|
|||
<template>
|
||||
<!-- <uv-list v-if="colums.length && data && Object.keys(data).length">
|
||||
<template v-for="(item, i) in columsList" :key="i">
|
||||
<slot :slotName="item.dataIndex" :data="item">
|
||||
<uv-list-item :title="item.title" :right-text="item?.value">
|
||||
</uv-list-item>
|
||||
</slot>
|
||||
</template>
|
||||
</uv-list> -->
|
||||
<uv-form labelWidth="160rpx">
|
||||
<template v-for="(item, i) in columsList" :key="i">
|
||||
<slot :slotName="item.dataIndex" :data="item">
|
||||
<uv-form-item :label="item.title" :labelPosition="item.labelPosition">
|
||||
<uv-input inputAlign="right" :border="`none`" v-model="item.value"></uv-input>
|
||||
</uv-form-item>
|
||||
</slot>
|
||||
</template>
|
||||
</uv-form>
|
||||
</template>
|
||||
<script setup>
|
||||
import { computed } from 'vue'
|
||||
|
||||
const props = defineProps({
|
||||
colums: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
data: {
|
||||
type: Object,
|
||||
default: () => {},
|
||||
},
|
||||
})
|
||||
|
||||
const columsList = computed(() => {
|
||||
const arr = []
|
||||
props.colums.forEach((e) => {
|
||||
const { dataIndex, format } = e
|
||||
// console.log(props.data)
|
||||
// props.data[dataIndex]
|
||||
let str =getValue(props.data,dataIndex)
|
||||
if (isFunction(format)) {
|
||||
str = format(str)
|
||||
}
|
||||
arr.push({
|
||||
...e,
|
||||
value: str,
|
||||
})
|
||||
})
|
||||
return arr
|
||||
})
|
||||
|
||||
const getValue = (obj, path) => {
|
||||
return path.split('.').reduce((acc, key) => (acc ? acc[key] : undefined), obj)
|
||||
}
|
||||
|
||||
const isFunction = (fn) => {
|
||||
return typeof fn === 'function'
|
||||
}
|
||||
</script>
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
import { timeFormat } from '@climblee/uv-ui/libs/function'
|
||||
export default {
|
||||
//清洁任务
|
||||
task_hygienes: [
|
||||
{
|
||||
title: '申请人',
|
||||
dataIndex: 'name',
|
||||
},
|
||||
{
|
||||
title: '所属门店',
|
||||
dataIndex: 'taskable.store.address',
|
||||
},
|
||||
{
|
||||
title: '电话号码',
|
||||
dataIndex: '',
|
||||
},
|
||||
{
|
||||
title: '申请时间',
|
||||
dataIndex: 'created_at',
|
||||
format: timeFormat,
|
||||
},
|
||||
{
|
||||
title: '清洁范围',
|
||||
dataIndex: 'taskable.description',
|
||||
labelPosition: 'top',
|
||||
},
|
||||
{
|
||||
title: '清洁结果',
|
||||
dataIndex: 'taskable.photos',
|
||||
},
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
<template>
|
||||
<view>
|
||||
<CuNavbar title="任务详情">
|
||||
<!-- <BaseData ></BaseData> -->
|
||||
</CuNavbar>
|
||||
{{ colums }}
|
||||
</view>
|
||||
</template>
|
||||
<script setup>
|
||||
import CuNavbar from '@/components/cu-navbar/index'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { ref, computed } from 'vue'
|
||||
import { http } from '@/utils/request'
|
||||
import BaseData from './base-data.vue'
|
||||
import datajson from './data.data'
|
||||
|
||||
const colums = computed(() => datajson[type.value] ?? [])
|
||||
const id = ref(null)
|
||||
const type = ref(null)
|
||||
onLoad((opt) => {
|
||||
id.value = opt.id
|
||||
type.value = opt.type
|
||||
getData()
|
||||
})
|
||||
|
||||
const getData = async () => {
|
||||
const resData = await http.get(`/workflow/${id.value}`, {
|
||||
params: {
|
||||
subject_type: type.value,
|
||||
},
|
||||
})
|
||||
|
||||
console.log(resData)
|
||||
}
|
||||
</script>
|
||||
|
|
@ -4,19 +4,27 @@
|
|||
</view>
|
||||
</template>
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { ref, watch, reactive } from 'vue'
|
||||
|
||||
const props = defineProps({
|
||||
data: Array,
|
||||
})
|
||||
|
||||
const opts = ref({
|
||||
color: [
|
||||
'#ee2c37',
|
||||
|
||||
],
|
||||
padding: [15, 15, 0, 15],
|
||||
color: ['#ee2c37'],
|
||||
dataLabel: false,
|
||||
dataPointShape: true,
|
||||
enableScroll: false,
|
||||
legend: {
|
||||
show:false
|
||||
show: false,
|
||||
},
|
||||
|
||||
xAxis: {
|
||||
disableGrid: true,
|
||||
// disableGrid: true,
|
||||
|
||||
boundaryGap: 'justify',
|
||||
|
||||
format: 'ssss',
|
||||
},
|
||||
yAxis: {
|
||||
gridType: 'dash',
|
||||
|
|
@ -31,15 +39,30 @@ const opts = ref({
|
|||
gradient: true,
|
||||
activeType: 'hollow',
|
||||
},
|
||||
tooltip: {
|
||||
legendShow: false,
|
||||
},
|
||||
},
|
||||
})
|
||||
const chartData = ref({
|
||||
categories: ['2016', '2017', '2018', '2019', '2020', '2021'],
|
||||
|
||||
const chartData = reactive({
|
||||
categories: [],
|
||||
series: [
|
||||
{
|
||||
name: '目标值',
|
||||
data: [35, 36, 31, 33, 13, 34],
|
||||
}
|
||||
name: '金额',
|
||||
data: [],
|
||||
},
|
||||
],
|
||||
})
|
||||
watch(
|
||||
() => props.data,
|
||||
(e) => {
|
||||
chartData.categories = e.map((el) => el.key)
|
||||
chartData.series[0].data = e.map((el) => el.value)
|
||||
},
|
||||
{
|
||||
immediate: true,
|
||||
deep: true,
|
||||
}
|
||||
)
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -9,18 +9,18 @@
|
|||
<uv-icon color="#fff" size="48rpx" name="chat"></uv-icon>
|
||||
</view>
|
||||
<view class="mt-60rpx">昨日累计金额</view>
|
||||
<view class="mt-20rpx">截止2024-03-21</view>
|
||||
<view class="mt-20rpx">截止{{ yesterday }}</view>
|
||||
<view class="flex items-center mt-40rpx">
|
||||
<view class="flex-1 text-center">
|
||||
<view>销售</view>
|
||||
<view>20000</view>
|
||||
<view>{{ yesday_ledger.sales }}</view>
|
||||
</view>
|
||||
<view class="h-80rpx flex-none flex-center">
|
||||
<uv-line direction="vertical"></uv-line>
|
||||
</view>
|
||||
<view class="flex-1 text-center">
|
||||
<view>支出</view>
|
||||
<view>20000</view>
|
||||
<view>{{ yesday_ledger.expenditure }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
|
@ -32,10 +32,12 @@
|
|||
:activeStyle="{ color: '#ee2c37' }"
|
||||
lineColor="#ee2c37"
|
||||
:list="list"
|
||||
:current="tabIndex"
|
||||
@click="onTabClick"
|
||||
:scrollable="false"
|
||||
></uv-tabs>
|
||||
<ChartComp></ChartComp>
|
||||
|
||||
<ChartComp :data="countData"></ChartComp>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
|
@ -43,17 +45,63 @@
|
|||
import { ref, reactive, computed } from 'vue'
|
||||
import ChartComp from './components/chart.vue'
|
||||
import StoreDropDown from '@/pages/home/components/store-drop-down/index.vue'
|
||||
|
||||
import { http } from '@/utils/request'
|
||||
import { onShow } from '@dcloudio/uni-app'
|
||||
import { timeFormat } from '@climblee/uv-ui/libs/function'
|
||||
const list = ref([
|
||||
{
|
||||
name: '销售金额',
|
||||
key: 'sales',
|
||||
},
|
||||
{
|
||||
name: '支出金额',
|
||||
key: 'expenditure',
|
||||
},
|
||||
])
|
||||
const tabIndex = ref(0)
|
||||
const detail = ref({
|
||||
yesday_ledger: {
|
||||
sales: 0,
|
||||
expenditure: 0,
|
||||
},
|
||||
})
|
||||
const yesday_ledger = computed(() => detail.value.yesday_ledger)
|
||||
const trends_of_30days = computed(() => detail.value.trends_of_30days)
|
||||
|
||||
const yesterday = computed(() => {
|
||||
return timeFormat(Number(new Date()) - 1000 * 60 * 60 * 24)
|
||||
})
|
||||
const tabObj = computed(() => list.value[tabIndex.value])
|
||||
const countData = computed(() => {
|
||||
const arr =
|
||||
trends_of_30days?.value?.reduce((p, c) => {
|
||||
p.push({
|
||||
key: timeFormat(c.date, 'mm月dd日'),
|
||||
value: c[tabObj.value.key],
|
||||
})
|
||||
return p
|
||||
}, []) ?? []
|
||||
return arr
|
||||
})
|
||||
|
||||
const onTabClick = (e) => {
|
||||
console.log(e)
|
||||
tabIndex.value = e.index
|
||||
}
|
||||
|
||||
onShow(() => {
|
||||
getData()
|
||||
})
|
||||
|
||||
const getData = () => {
|
||||
http
|
||||
.get('/statistics/dashboard', {
|
||||
params: {
|
||||
date: yesterday.value,
|
||||
},
|
||||
})
|
||||
.then((res) => {
|
||||
detail.value = res
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@ const form = ref({
|
|||
})
|
||||
|
||||
const handleClick = async () => {
|
||||
|
||||
try {
|
||||
const { username, password } = form.value
|
||||
await userStore.login({
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
<template>
|
||||
<view>
|
||||
<CuNavbar :isBack="isBack" title="上报"></CuNavbar>
|
||||
|
||||
<view
|
||||
:class="[
|
||||
checkPermission(['store']) && form.allow_rereport
|
||||
|
|
@ -141,7 +142,7 @@
|
|||
</view>
|
||||
</uv-form>
|
||||
</view>
|
||||
<view class="h-130rpx">
|
||||
<view class="h-130rpx" v-if="checkPermission(['store']) && form.allow_rereport">
|
||||
<view
|
||||
class="fixed bottom-0 left-0 right-0 h-120rpx bg-white flex-center box-border px-base"
|
||||
:style="style"
|
||||
|
|
@ -238,8 +239,9 @@ const style = computed(() => {
|
|||
return style
|
||||
})
|
||||
|
||||
onShow(() => {
|
||||
getData(endDate)
|
||||
onMounted(() => {
|
||||
// console.log(endDate);
|
||||
getData()
|
||||
})
|
||||
|
||||
const submit = () => {
|
||||
|
|
@ -249,6 +251,7 @@ const submit = () => {
|
|||
}
|
||||
|
||||
const onSubmit = async () => {
|
||||
|
||||
const params = {
|
||||
date: form.date,
|
||||
sales: form.sales,
|
||||
|
|
@ -279,6 +282,7 @@ const onSubmit = async () => {
|
|||
}
|
||||
|
||||
const getData = async () => {
|
||||
|
||||
const resData = await http.get(`/ledgers/${form.date}`)
|
||||
|
||||
Object.assign(form, resData, {
|
||||
|
|
@ -359,6 +363,7 @@ const uploadFilePromise = (url) => {
|
|||
.upload('/fileupload', {
|
||||
filePath: url,
|
||||
name: 'file',
|
||||
|
||||
})
|
||||
.then((res) => {
|
||||
resolve(res.url)
|
||||
|
|
|
|||
|
|
@ -7,10 +7,20 @@
|
|||
<view class="text-30rpx">{{ item.name }}</view>
|
||||
<view
|
||||
:style="{
|
||||
color: statusFun(item.taskable.status, item.taskable_type, 'color'),
|
||||
color: statusFun(
|
||||
item.taskable.status,
|
||||
isCheck ? 'statusExpense' : item.taskable_type,
|
||||
'color'
|
||||
),
|
||||
}"
|
||||
class="text-24rpx"
|
||||
>{{ statusFun(item.taskable.status, item.taskable_type, 'name') }}</view
|
||||
>{{
|
||||
statusFun(
|
||||
item.taskable.status,
|
||||
isCheck ? 'statusExpense' : item.taskable_type,
|
||||
'name'
|
||||
)
|
||||
}}</view
|
||||
>
|
||||
</view>
|
||||
<view class="text-24rpx text-hex-999999">
|
||||
|
|
@ -25,21 +35,26 @@ import statusFun from '@/utils/status'
|
|||
import { timeFormat } from '@climblee/uv-ui/libs/function/index'
|
||||
const props = defineProps({
|
||||
item: Object,
|
||||
isCheck: Boolean,
|
||||
type: String,
|
||||
})
|
||||
|
||||
const onClick = () => {
|
||||
console.log(props.item)
|
||||
const type = props.item.taskable_type
|
||||
const { status } = props.item.taskable
|
||||
let url
|
||||
if (type === 'task_hygienes') {
|
||||
if (status === 2 || status == 4) {
|
||||
url = `/pages/task/task_hygienes_submit?id=${props.item.id}`
|
||||
} else {
|
||||
url = `/pages/task/detail?id=${props.item.id}`
|
||||
if (props.isCheck) {
|
||||
url = `/pages/audits/detail?id=${props.item.id}&type=${type}`
|
||||
} else {
|
||||
if (type === 'task_hygienes') {
|
||||
if (status === 2 || status == 4) {
|
||||
url = `/pages/task/task_hygienes_submit?id=${props.item.id}`
|
||||
} else {
|
||||
url = `/pages/task/detail?id=${props.item.id}`
|
||||
}
|
||||
} else if (type === 'task_ledgers') {
|
||||
url = `/pages/task/${type}_submit?id=${props.item.id}`
|
||||
}
|
||||
} else if (type === 'task_ledgers') {
|
||||
url = `/pages/task/${type}_submit?id=${props.item.id}`
|
||||
}
|
||||
uni.navigateTo({
|
||||
url: url,
|
||||
|
|
|
|||
|
|
@ -1,76 +0,0 @@
|
|||
<template>
|
||||
<view class="px-base">
|
||||
<CuNavbar title="任务详情"></CuNavbar>
|
||||
<view
|
||||
class="mt-30rpx card-shadow bg-white rounded-19rpx px-base text-[#333333] text-27rpx"
|
||||
>
|
||||
<view class="py-20rpx flex items-center justify-between">
|
||||
<view>申请人</view>
|
||||
<view class="text-hex-999999">测试人</view>
|
||||
</view>
|
||||
<uv-line></uv-line>
|
||||
<view class="py-20rpx flex items-center justify-between">
|
||||
<view>所属门店</view>
|
||||
<view class="text-hex-999999">具体门店名称</view>
|
||||
</view>
|
||||
<uv-line></uv-line>
|
||||
<view class="py-20rpx flex items-center justify-between">
|
||||
<view>电话号码</view>
|
||||
<view class="text-hex-999999">具体门店名称</view>
|
||||
</view>
|
||||
<uv-line></uv-line>
|
||||
<view class="py-20rpx flex items-center justify-between">
|
||||
<view>申请时间</view>
|
||||
<view class="text-hex-999999">具体门店名称</view>
|
||||
</view>
|
||||
<uv-line></uv-line>
|
||||
<view class="py-20rpx">
|
||||
<view>申请范围</view>
|
||||
<view class="text-hex-999999 mt-20rpx">具体门店名称</view>
|
||||
</view>
|
||||
<uv-line></uv-line>
|
||||
<view class="py-20rpx">
|
||||
<view>清洁结果</view>
|
||||
<view class="text-hex-999999 mt-20rpx">
|
||||
<view class="bg-gray-50 b-solid w-130rpx h-130rpx"></view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="h-100rpx">
|
||||
<view
|
||||
class="fixed bottom-0 left-0 right-0 h-120rpx bg-white flex items-center px-base space-x-30rpx"
|
||||
>
|
||||
<view class="flex-1">
|
||||
<uv-button color="#999999" shape="circle" plain block>
|
||||
拒绝
|
||||
</uv-button>
|
||||
</view>
|
||||
<view class="flex-1">
|
||||
<uv-button type="primary" shape="circle" block> 通过 </uv-button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<script setup>
|
||||
import CuNavbar from '@/components/cu-navbar/index'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { http } from '@/utils/request'
|
||||
import { ref } from 'vue'
|
||||
|
||||
const id = ref(null)
|
||||
onLoad((opt) => {
|
||||
id.value = opt.id
|
||||
|
||||
getDetail()
|
||||
})
|
||||
|
||||
const getDetail = async () => {
|
||||
const resdata = await http.get(`/tasks/${id.value}`, {
|
||||
params: {
|
||||
id: id.value,
|
||||
},
|
||||
})
|
||||
console.log(resdata);
|
||||
}
|
||||
</script>
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
<template>
|
||||
<view class="px-base">
|
||||
<CuNavbar title="任务详情"></CuNavbar>
|
||||
|
||||
<BaseCompApi :apiUrl="`/tasks/${id}`" :colums="baseColums">
|
||||
<!-- <template v-slot="{ slotName, data }">
|
||||
<view v-if="slotName == 'taskable.description'">
|
||||
{{ data }}
|
||||
</view>
|
||||
</template> -->
|
||||
</BaseCompApi>
|
||||
|
||||
<view class="h-100rpx">
|
||||
<view
|
||||
class="fixed bottom-0 left-0 right-0 h-120rpx bg-white flex items-center px-base space-x-30rpx"
|
||||
>
|
||||
<view class="flex-1">
|
||||
<uv-button color="#999999" shape="circle" plain block>
|
||||
拒绝
|
||||
</uv-button>
|
||||
</view>
|
||||
<view class="flex-1">
|
||||
<uv-button type="primary" shape="circle" block> 通过 </uv-button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<script setup>
|
||||
import CuNavbar from '@/components/cu-navbar/index'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { ref } from 'vue'
|
||||
import BaseCompApi from '@/components/base-comp/base-api.vue'
|
||||
import { timeFormat } from '@climblee/uv-ui/libs/function'
|
||||
const baseColums = [
|
||||
{
|
||||
title: '申请人',
|
||||
dataIndex: 'name',
|
||||
},
|
||||
{
|
||||
title: '所属门店',
|
||||
dataIndex: 'taskable.store.address',
|
||||
},
|
||||
{
|
||||
title: '电话号码',
|
||||
dataIndex: '',
|
||||
},
|
||||
{
|
||||
title: '申请时间',
|
||||
dataIndex: 'created_at',
|
||||
format: timeFormat,
|
||||
},
|
||||
{
|
||||
title: '清洁范围',
|
||||
dataIndex: 'taskable.description',
|
||||
labelPosition: 'top',
|
||||
},
|
||||
]
|
||||
const id = ref(null)
|
||||
|
||||
onLoad((opt) => {
|
||||
id.value = opt.id
|
||||
})
|
||||
</script>
|
||||
|
|
@ -1,16 +1,38 @@
|
|||
<template>
|
||||
<view class="px-base">
|
||||
<CuNavbar title="任务详情"></CuNavbar>
|
||||
|
||||
<BaseCompApi :apiUrl="`/tasks/${id}`" :colums="baseColums">
|
||||
<template v-slot="{ slotName, data }">
|
||||
<view v-if="slotName == 'taskable.description'">
|
||||
{{ data }}
|
||||
<view
|
||||
class="mt-30rpx card-shadow bg-white rounded-19rpx px-base text-[#333333] text-27rpx"
|
||||
>
|
||||
<template v-for="(item, i) in columsList" :key="i">
|
||||
<template v-if="item.dataIndex == 'taskable.photos'">
|
||||
<view class="py-20rpx">
|
||||
<view>{{ item.title }}</view>
|
||||
<view class="grid grid-cols-3 gap-15rpx mt-20rpx">
|
||||
<view class="" v-for="op in item.value" :key="op">
|
||||
<image class="w-full" mode="widthFix" :src="op"></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<view
|
||||
v-else
|
||||
class="py-20rpx flex"
|
||||
:class="[
|
||||
[
|
||||
item.labelPosition == 'top'
|
||||
? 'flex-col space-y-10rpx'
|
||||
: 'items-center justify-between',
|
||||
],
|
||||
]"
|
||||
>
|
||||
<view>{{ item.title }}</view>
|
||||
<view class="text-hex-999999">{{ item.value }}</view>
|
||||
</view>
|
||||
<uv-line color="#f5f5f5" v-if="i != columsList.length - 1"></uv-line>
|
||||
</template>
|
||||
</BaseCompApi>
|
||||
|
||||
<view class="h-100rpx">
|
||||
</view>
|
||||
<!-- <view class="h-100rpx">
|
||||
<view
|
||||
class="fixed bottom-0 left-0 right-0 h-120rpx bg-white flex items-center px-base space-x-30rpx"
|
||||
>
|
||||
|
|
@ -23,14 +45,14 @@
|
|||
<uv-button type="primary" shape="circle" block> 通过 </uv-button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view> -->
|
||||
</view>
|
||||
</template>
|
||||
<script setup>
|
||||
import CuNavbar from '@/components/cu-navbar/index'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { ref } from 'vue'
|
||||
import BaseCompApi from '@/components/base-comp/base-api.vue'
|
||||
import { http } from '@/utils/request'
|
||||
import { ref, computed } from 'vue'
|
||||
import { timeFormat } from '@climblee/uv-ui/libs/function'
|
||||
const baseColums = [
|
||||
{
|
||||
|
|
@ -55,10 +77,49 @@ const baseColums = [
|
|||
dataIndex: 'taskable.description',
|
||||
labelPosition: 'top',
|
||||
},
|
||||
{
|
||||
title: '清洁结果',
|
||||
dataIndex: 'taskable.photos',
|
||||
},
|
||||
]
|
||||
const id = ref(null)
|
||||
const data = ref({})
|
||||
|
||||
const columsList = computed(() => {
|
||||
const arr = []
|
||||
baseColums.forEach((e) => {
|
||||
const { dataIndex, format } = e
|
||||
let str = getValue(data.value, dataIndex)
|
||||
if (isFunction(format)) {
|
||||
str = format(str)
|
||||
}
|
||||
arr.push({
|
||||
...e,
|
||||
value: str,
|
||||
})
|
||||
})
|
||||
return arr
|
||||
})
|
||||
|
||||
onLoad((opt) => {
|
||||
id.value = opt.id
|
||||
getDetail()
|
||||
})
|
||||
|
||||
const getDetail = async () => {
|
||||
const resdata = await http.get(`/tasks/${id.value}`, {
|
||||
params: {
|
||||
id: id.value,
|
||||
},
|
||||
})
|
||||
data.value = resdata
|
||||
}
|
||||
|
||||
const getValue = (obj, path) => {
|
||||
return path.split('.').reduce((acc, key) => (acc ? acc[key] : undefined), obj)
|
||||
}
|
||||
|
||||
const isFunction = (fn) => {
|
||||
return typeof fn === 'function'
|
||||
}
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -35,7 +35,19 @@
|
|||
:index="tabIndex"
|
||||
:apiUrl="tabList[1].apiUrl"
|
||||
:params="tabList[1].params"
|
||||
></MescrollItem>
|
||||
>
|
||||
<template v-slot="{ list }">
|
||||
<view class="space-y-15rpx p-base">
|
||||
<view v-for="(item, i) in list" :key="i">
|
||||
<Item
|
||||
:item="item"
|
||||
isCheck
|
||||
:type="tabList[1].params.subject_type"
|
||||
></Item>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
</MescrollItem>
|
||||
</view>
|
||||
</template>
|
||||
<script setup>
|
||||
|
|
@ -64,7 +76,7 @@ const tabList = ref([
|
|||
name: '任务审核',
|
||||
apiUrl: '/workflow',
|
||||
params: {
|
||||
// aaa:111
|
||||
subject_type: 'task_hygienes'
|
||||
},
|
||||
},
|
||||
])
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ export const useUserStore = defineStore({
|
|||
id: 'app-user',
|
||||
state: () => ({
|
||||
userInfo: null,
|
||||
token: '22|ua3STGluZFzDeV1nOs4I3S9s2UCDtQp9AtVLT2jN0535e0a5',
|
||||
token: null,
|
||||
roles: []
|
||||
}),
|
||||
getters: {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
import { createPersistedState } from 'pinia-plugin-persistedstate';
|
||||
export const PERSIST_KEY_PREFIX = 'lottery';
|
||||
export const PERSIST_KEY_PREFIX = 'lottery1';
|
||||
|
||||
export function registerPiniaPersistPlugin(pinia) {
|
||||
pinia.use(createPersistedState(createPersistedStateOptions(PERSIST_KEY_PREFIX)));
|
||||
|
|
|
|||
|
|
@ -55,6 +55,10 @@ const cfu = {
|
|||
//下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
|
||||
"formatter":{
|
||||
"yAxisDemo1":function(val, index, opts){return val+'元'},
|
||||
"ssss":function(val,index,opts){
|
||||
console.log((index % 5)==0?val:'');
|
||||
return (index % 8)==0?val:''
|
||||
},
|
||||
"yAxisDemo2":function(val, index, opts){return val.toFixed(2)},
|
||||
"xAxisDemo1":function(val, index, opts){return val+'年';},
|
||||
"xAxisDemo2":function(val, index, opts){return formatDateTime(val,'h:m')},
|
||||
|
|
|
|||
Loading…
Reference in New Issue