add
This commit is contained in:
@@ -211,6 +211,26 @@ public class AdminController {
|
||||
return ApiResponse.success(billService.createBill(bill));
|
||||
}
|
||||
|
||||
@PutMapping("/bills")
|
||||
public ApiResponse<Void> updateBill(@RequestBody BillRequest request) {
|
||||
Bill existing = billMapper.findById(request.getId());
|
||||
if (existing == null) {
|
||||
throw new ApiException("账单不存在");
|
||||
}
|
||||
Bill bill = new Bill();
|
||||
bill.setId(request.getId());
|
||||
bill.setElderId(request.getElderId());
|
||||
bill.setMonth(request.getMonth());
|
||||
bill.setBedFee(request.getBedFee());
|
||||
bill.setCareFee(request.getCareFee());
|
||||
bill.setMealFee(request.getMealFee());
|
||||
bill.setOtherFee(request.getOtherFee());
|
||||
bill.setTotal(billService.calcTotal(bill));
|
||||
bill.setStatus(existing.getStatus());
|
||||
billMapper.update(bill);
|
||||
return ApiResponse.success();
|
||||
}
|
||||
|
||||
@GetMapping("/bills")
|
||||
public ApiResponse<List<Bill>> listBills(@RequestParam(required = false) Long elderId) {
|
||||
if (elderId == null) {
|
||||
@@ -219,6 +239,16 @@ public class AdminController {
|
||||
return ApiResponse.success(billService.listByElderId(elderId));
|
||||
}
|
||||
|
||||
@DeleteMapping("/bills/{id}")
|
||||
public ApiResponse<Void> deleteBill(@PathVariable Long id) {
|
||||
Bill existing = billMapper.findById(id);
|
||||
if (existing == null) {
|
||||
throw new ApiException("账单不存在");
|
||||
}
|
||||
billMapper.delete(id);
|
||||
return ApiResponse.success();
|
||||
}
|
||||
|
||||
@GetMapping("/feedback")
|
||||
public ApiResponse<List<Feedback>> listFeedback() {
|
||||
return ApiResponse.success(feedbackMapper.listAll());
|
||||
|
||||
@@ -149,6 +149,12 @@ public class FamilyController {
|
||||
return ApiResponse.success(feedback);
|
||||
}
|
||||
|
||||
@GetMapping("/feedback")
|
||||
public ApiResponse<List<Feedback>> listFeedback() {
|
||||
Long familyId = Long.valueOf(StpUtil.getLoginId().toString());
|
||||
return ApiResponse.success(feedbackMapper.listByFamilyId(familyId));
|
||||
}
|
||||
|
||||
@GetMapping("/notices")
|
||||
public ApiResponse<List<Notice>> listNotices() {
|
||||
Long familyId = Long.valueOf(StpUtil.getLoginId().toString());
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.nursinghome.dto;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
public class BillRequest {
|
||||
private Long id;
|
||||
private Long elderId;
|
||||
private String month;
|
||||
private BigDecimal bedFee;
|
||||
@@ -10,6 +11,14 @@ public class BillRequest {
|
||||
private BigDecimal mealFee;
|
||||
private BigDecimal otherFee;
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Long getElderId() {
|
||||
return elderId;
|
||||
}
|
||||
|
||||
@@ -25,4 +25,10 @@ public interface BillMapper {
|
||||
|
||||
@Update("UPDATE bill SET status=#{status}, paid_at=#{paidAt} WHERE id=#{id}")
|
||||
int updateStatus(Bill bill);
|
||||
|
||||
@Update("UPDATE bill SET elder_id=#{elderId}, month=#{month}, bed_fee=#{bedFee}, care_fee=#{careFee}, meal_fee=#{mealFee}, other_fee=#{otherFee}, total=#{total}, status=#{status} WHERE id=#{id}")
|
||||
int update(Bill bill);
|
||||
|
||||
@Delete("DELETE FROM bill WHERE id=#{id}")
|
||||
int delete(Long id);
|
||||
}
|
||||
|
||||
@@ -14,6 +14,9 @@ public interface FeedbackMapper {
|
||||
@Select("SELECT * FROM feedback ORDER BY created_at DESC")
|
||||
List<Feedback> listAll();
|
||||
|
||||
@Select("SELECT * FROM feedback WHERE family_id = #{familyId} ORDER BY created_at DESC")
|
||||
List<Feedback> listByFamilyId(Long familyId);
|
||||
|
||||
@Update("UPDATE feedback SET status=#{status}, reply=#{reply}, updated_at=NOW() WHERE id=#{id}")
|
||||
int updateStatus(Feedback feedback);
|
||||
}
|
||||
|
||||
@@ -22,12 +22,7 @@ public class BillService {
|
||||
|
||||
public Bill createBill(Bill bill) {
|
||||
if (bill.getTotal() == null) {
|
||||
BigDecimal total = BigDecimal.ZERO;
|
||||
if (bill.getBedFee() != null) total = total.add(bill.getBedFee());
|
||||
if (bill.getCareFee() != null) total = total.add(bill.getCareFee());
|
||||
if (bill.getMealFee() != null) total = total.add(bill.getMealFee());
|
||||
if (bill.getOtherFee() != null) total = total.add(bill.getOtherFee());
|
||||
bill.setTotal(total);
|
||||
bill.setTotal(calcTotal(bill));
|
||||
}
|
||||
if (bill.getStatus() == null) {
|
||||
bill.setStatus("UNPAID");
|
||||
@@ -36,6 +31,15 @@ public class BillService {
|
||||
return bill;
|
||||
}
|
||||
|
||||
public BigDecimal calcTotal(Bill bill) {
|
||||
BigDecimal total = BigDecimal.ZERO;
|
||||
if (bill.getBedFee() != null) total = total.add(bill.getBedFee());
|
||||
if (bill.getCareFee() != null) total = total.add(bill.getCareFee());
|
||||
if (bill.getMealFee() != null) total = total.add(bill.getMealFee());
|
||||
if (bill.getOtherFee() != null) total = total.add(bill.getOtherFee());
|
||||
return total;
|
||||
}
|
||||
|
||||
public List<Bill> listByElderId(Long elderId) {
|
||||
return billMapper.listByElderId(elderId);
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ mybatis:
|
||||
sa-token:
|
||||
token-name: satoken
|
||||
timeout: 86400
|
||||
activity-timeout: -1
|
||||
is-concurrent: true
|
||||
is-share: true
|
||||
token-style: uuid
|
||||
|
||||
@@ -16,11 +16,24 @@ http.interceptors.response.use(
|
||||
(response) => {
|
||||
const data = response.data;
|
||||
if (data && data.code !== 0) {
|
||||
return Promise.reject(new Error(data.message || "request error"));
|
||||
if (data.message && (data.message.includes("未登录") || data.message.includes("token"))) {
|
||||
localStorage.removeItem("token");
|
||||
localStorage.removeItem("role");
|
||||
window.location.href = "/login";
|
||||
}
|
||||
return Promise.reject(new Error(data.message || "请求失败"));
|
||||
}
|
||||
return response;
|
||||
},
|
||||
(error) => Promise.reject(error)
|
||||
(error) => {
|
||||
if (error && error.response && error.response.status === 401) {
|
||||
localStorage.removeItem("token");
|
||||
localStorage.removeItem("role");
|
||||
window.location.href = "/login";
|
||||
}
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
|
||||
export default http;
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ export const scheduleUpdate = (payload) => http.put("/admin/schedules", payload)
|
||||
export const scheduleDelete = (id) => http.delete(`/admin/schedules/${id}`);
|
||||
|
||||
export const billsCreate = (payload) => http.post("/admin/bills", payload);
|
||||
export const billsUpdate = (payload) => http.put("/admin/bills", payload);
|
||||
export const billsDelete = (id) => http.delete(`/admin/bills/${id}`);
|
||||
export const billsList = (elderId) => http.get("/admin/bills", { params: { elderId } });
|
||||
|
||||
export const feedbackList = () => http.get("/admin/feedback");
|
||||
@@ -47,6 +49,7 @@ export const familyHealthList = (elderId) => http.get("/family/health-records",
|
||||
export const familyBills = (elderId) => http.get("/family/bills", { params: { elderId } });
|
||||
export const familyPay = (id, payload) => http.post(`/family/bills/${id}/pay`, payload);
|
||||
export const familyFeedback = (payload) => http.post("/family/feedback", payload);
|
||||
export const familyFeedbackList = () => http.get("/family/feedback");
|
||||
export const familyNoticeList = () => http.get("/family/notices");
|
||||
|
||||
export const uploadFile = (file) => {
|
||||
|
||||
@@ -46,7 +46,7 @@ export default {
|
||||
this.$router.push("/family");
|
||||
}
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "login failed");
|
||||
this.$message.error(e.message || "登录失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -73,3 +73,4 @@ export default {
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@@ -50,10 +50,10 @@ export default {
|
||||
async handleRegister() {
|
||||
try {
|
||||
await register(this.form);
|
||||
this.$message.success("registered");
|
||||
this.$message.success("注册成功");
|
||||
this.$router.push("/login");
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "register failed");
|
||||
this.$message.error(e.message || "注册失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -80,3 +80,5 @@ export default {
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
|
||||
@@ -8,7 +8,11 @@
|
||||
</div>
|
||||
<el-table :data="bills" stripe>
|
||||
<el-table-column prop="id" label="编号" width="80" />
|
||||
<el-table-column prop="elderId" label="长者ID" width="100" />
|
||||
<el-table-column label="长者" width="140">
|
||||
<template slot-scope="scope">
|
||||
{{ elderName(scope.row.elderId) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="month" label="月份" />
|
||||
<el-table-column prop="total" label="金额" />
|
||||
<el-table-column label="状态" width="120">
|
||||
@@ -18,12 +22,24 @@
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="180">
|
||||
<template slot-scope="scope">
|
||||
<el-button size="mini" @click="openEdit(scope.row)">编辑</el-button>
|
||||
<el-button size="mini" type="danger" @click="remove(scope.row)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<el-dialog title="新建账单" :visible.sync="showCreate">
|
||||
<el-form :model="form" label-width="120px">
|
||||
<el-form-item label="长者ID"><el-input v-model="form.elderId"/></el-form-item>
|
||||
<el-form-item label="月份"><el-input v-model="form.month" placeholder="YYYY-MM"/></el-form-item>
|
||||
<el-form-item label="长者">
|
||||
<el-select v-model="form.elderId" placeholder="选择长者">
|
||||
<el-option v-for="elder in elders" :key="elder.id" :label="elder.name" :value="elder.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="月份">
|
||||
<el-date-picker v-model="form.month" type="month" placeholder="选择月份" />
|
||||
</el-form-item>
|
||||
<el-form-item label="床位费"><el-input v-model="form.bedFee"/></el-form-item>
|
||||
<el-form-item label="护理费"><el-input v-model="form.careFee"/></el-form-item>
|
||||
<el-form-item label="餐饮费"><el-input v-model="form.mealFee"/></el-form-item>
|
||||
@@ -34,25 +50,74 @@
|
||||
<el-button type="primary" @click="create">创建</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog title="修改账单" :visible.sync="showEdit">
|
||||
<el-form :model="editForm" label-width="120px">
|
||||
<el-form-item label="长者">
|
||||
<el-select v-model="editForm.elderId" placeholder="选择长者">
|
||||
<el-option v-for="elder in elders" :key="elder.id" :label="elder.name" :value="elder.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="月份">
|
||||
<el-date-picker v-model="editForm.month" type="month" placeholder="选择月份" />
|
||||
</el-form-item>
|
||||
<el-form-item label="床位费"><el-input v-model="editForm.bedFee"/></el-form-item>
|
||||
<el-form-item label="护理费"><el-input v-model="editForm.careFee"/></el-form-item>
|
||||
<el-form-item label="餐饮费"><el-input v-model="editForm.mealFee"/></el-form-item>
|
||||
<el-form-item label="其他费用"><el-input v-model="editForm.otherFee"/></el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer">
|
||||
<el-button @click="showEdit = false">取消</el-button>
|
||||
<el-button type="primary" @click="update">保存</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { billsList, billsCreate } from "../../api";
|
||||
import { billsList, billsCreate, billsUpdate, billsDelete, eldersList } from "../../api";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
bills: [],
|
||||
elders: [],
|
||||
elderMap: {},
|
||||
filterElderId: "",
|
||||
showCreate: false,
|
||||
form: { elderId: "", month: "", bedFee: "", careFee: "", mealFee: "", otherFee: "" }
|
||||
showEdit: false,
|
||||
form: { elderId: "", month: "", bedFee: "", careFee: "", mealFee: "", otherFee: "" },
|
||||
editForm: { id: null, elderId: "", month: "", bedFee: "", careFee: "", mealFee: "", otherFee: "" }
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.load();
|
||||
this.loadElders();
|
||||
},
|
||||
methods: {
|
||||
async loadElders() {
|
||||
try {
|
||||
const res = await eldersList();
|
||||
this.elders = res.data.data;
|
||||
const map = {};
|
||||
this.elders.forEach((elder) => {
|
||||
map[elder.id] = elder.name;
|
||||
});
|
||||
this.elderMap = map;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "加载长者失败");
|
||||
}
|
||||
},
|
||||
elderName(id) {
|
||||
return this.elderMap[id] || `长者${id}`;
|
||||
},
|
||||
formatMonth(value) {
|
||||
if (!value) return "";
|
||||
const d = new Date(value);
|
||||
const y = d.getFullYear();
|
||||
const m = String(d.getMonth() + 1).padStart(2, "0");
|
||||
return `${y}-${m}`;
|
||||
},
|
||||
statusLabel(status) {
|
||||
if (status === "PAID") return "已支付";
|
||||
if (status === "UNPAID") return "未支付";
|
||||
@@ -68,18 +133,53 @@ export default {
|
||||
const res = await billsList(this.filterElderId || null);
|
||||
this.bills = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
},
|
||||
async create() {
|
||||
try {
|
||||
await billsCreate(this.form);
|
||||
const payload = { ...this.form, month: this.formatMonth(this.form.month) };
|
||||
await billsCreate(payload);
|
||||
this.showCreate = false;
|
||||
this.load();
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "create failed");
|
||||
this.$message.error(e.message || "创建失败");
|
||||
}
|
||||
},
|
||||
openEdit(row) {
|
||||
this.editForm = {
|
||||
id: row.id,
|
||||
elderId: row.elderId,
|
||||
month: row.month ? new Date(`${row.month}-01`) : "",
|
||||
bedFee: row.bedFee,
|
||||
careFee: row.careFee,
|
||||
mealFee: row.mealFee,
|
||||
otherFee: row.otherFee
|
||||
};
|
||||
this.showEdit = true;
|
||||
},
|
||||
async update() {
|
||||
try {
|
||||
const payload = { ...this.editForm, month: this.formatMonth(this.editForm.month) };
|
||||
await billsUpdate(payload);
|
||||
this.showEdit = false;
|
||||
this.load();
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "更新失败");
|
||||
}
|
||||
},
|
||||
async remove(row) {
|
||||
try {
|
||||
await this.$confirm("确认删除该账单?", "提示", { type: "warning" });
|
||||
await billsDelete(row.id);
|
||||
this.load();
|
||||
} catch (e) {
|
||||
if (e && e !== "cancel") {
|
||||
this.$message.error(e.message || "删除失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -42,8 +42,9 @@ export default {
|
||||
const res = await adminStats();
|
||||
this.stats = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -7,7 +7,11 @@
|
||||
<el-table :data="elders" stripe>
|
||||
<el-table-column prop="id" label="编号" width="80" />
|
||||
<el-table-column prop="name" label="姓名" />
|
||||
<el-table-column prop="gender" label="性别" width="80" />
|
||||
<el-table-column label="性别" width="80">
|
||||
<template slot-scope="scope">
|
||||
{{ genderLabel(scope.row.gender) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="idCard" label="身份证号" />
|
||||
<el-table-column prop="roomNo" label="房间号" width="100" />
|
||||
<el-table-column prop="careLevel" label="护理等级" />
|
||||
@@ -107,12 +111,17 @@ export default {
|
||||
this.load();
|
||||
},
|
||||
methods: {
|
||||
genderLabel(value) {
|
||||
if (value === "M") return "男";
|
||||
if (value === "F") return "女";
|
||||
return value || "-";
|
||||
},
|
||||
async load() {
|
||||
try {
|
||||
const res = await eldersList();
|
||||
this.elders = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
},
|
||||
async createElder() {
|
||||
@@ -126,7 +135,7 @@ export default {
|
||||
this.showCreate = false;
|
||||
this.load();
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "create failed");
|
||||
this.$message.error(e.message || "创建失败");
|
||||
}
|
||||
},
|
||||
editElder(row) {
|
||||
@@ -144,7 +153,7 @@ export default {
|
||||
this.showEdit = false;
|
||||
this.load();
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "update failed");
|
||||
this.$message.error(e.message || "更新失败");
|
||||
}
|
||||
},
|
||||
async deleteElder(row) {
|
||||
@@ -152,7 +161,7 @@ export default {
|
||||
await eldersDelete(row.id);
|
||||
this.load();
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "delete failed");
|
||||
this.$message.error(e.message || "删除失败");
|
||||
}
|
||||
},
|
||||
syncBirthday(type) {
|
||||
@@ -182,3 +191,4 @@ export default {
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -3,7 +3,11 @@
|
||||
<h3>反馈处理</h3>
|
||||
<el-table :data="items" stripe>
|
||||
<el-table-column prop="id" label="编号" width="80" />
|
||||
<el-table-column prop="elderId" label="长者ID" />
|
||||
<el-table-column label="长者">
|
||||
<template slot-scope="scope">
|
||||
{{ elderName(scope.row.elderId) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="类型" width="120">
|
||||
<template slot-scope="scope">
|
||||
<el-tag :type="typeTag(scope.row.type)">
|
||||
@@ -48,20 +52,39 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { feedbackList, feedbackUpdate } from "../../api";
|
||||
import { feedbackList, feedbackUpdate, eldersList } from "../../api";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
items: [],
|
||||
elders: [],
|
||||
elderMap: {},
|
||||
showReply: false,
|
||||
replyForm: { id: null, status: "PROCESSING", reply: "" }
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.load();
|
||||
this.loadElders();
|
||||
},
|
||||
methods: {
|
||||
async loadElders() {
|
||||
try {
|
||||
const res = await eldersList();
|
||||
this.elders = res.data.data;
|
||||
const map = {};
|
||||
this.elders.forEach((elder) => {
|
||||
map[elder.id] = elder.name;
|
||||
});
|
||||
this.elderMap = map;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "加载长者失败");
|
||||
}
|
||||
},
|
||||
elderName(id) {
|
||||
return this.elderMap[id] || `长者${id}`;
|
||||
},
|
||||
typeLabel(type) {
|
||||
if (type === "SUGGESTION") return "建议";
|
||||
if (type === "COMPLAINT") return "投诉";
|
||||
@@ -91,7 +114,7 @@ export default {
|
||||
const res = await feedbackList();
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
},
|
||||
openReply(row) {
|
||||
@@ -104,9 +127,10 @@ export default {
|
||||
this.showReply = false;
|
||||
this.load();
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "update failed");
|
||||
this.$message.error(e.message || "更新失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ export default {
|
||||
const res = await noticeList();
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
},
|
||||
async create() {
|
||||
@@ -80,9 +80,10 @@ export default {
|
||||
this.showCreate = false;
|
||||
this.load();
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "create failed");
|
||||
this.$message.error(e.message || "创建失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ export default {
|
||||
const res = await adminUsers(this.role || null);
|
||||
this.users = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
},
|
||||
async createUser() {
|
||||
@@ -121,7 +121,7 @@ export default {
|
||||
this.showCreate = false;
|
||||
this.loadUsers();
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "create failed");
|
||||
this.$message.error(e.message || "创建失败");
|
||||
}
|
||||
},
|
||||
editUser(row) {
|
||||
@@ -134,17 +134,19 @@ export default {
|
||||
this.showEdit = false;
|
||||
this.loadUsers();
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "update failed");
|
||||
this.$message.error(e.message || "更新失败");
|
||||
}
|
||||
},
|
||||
async resetPwd(row) {
|
||||
try {
|
||||
await adminResetPassword(row.id, "123456");
|
||||
this.$message.success("reset to 123456");
|
||||
this.$message.success("已重置为123456");
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "reset failed");
|
||||
this.$message.error(e.message || "重置失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ export default {
|
||||
const res = await familyElders();
|
||||
this.elders = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -59,18 +59,19 @@ export default {
|
||||
const res = await familyBills(this.elderId);
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
},
|
||||
async pay(row) {
|
||||
try {
|
||||
await familyPay(row.id, { method: "ONLINE" });
|
||||
this.$message.success("paid");
|
||||
this.$message.success("支付成功");
|
||||
this.load();
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "pay failed");
|
||||
this.$message.error(e.message || "支付失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ export default {
|
||||
const res = await familyElders();
|
||||
this.elders = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -36,9 +36,10 @@ export default {
|
||||
const res = await familyCareList(this.elderId);
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -3,7 +3,11 @@
|
||||
<h3>亲人档案</h3>
|
||||
<el-table :data="elders" stripe>
|
||||
<el-table-column prop="name" label="姓名" />
|
||||
<el-table-column prop="gender" label="性别" width="80" />
|
||||
<el-table-column label="性别" width="80">
|
||||
<template slot-scope="scope">
|
||||
{{ genderLabel(scope.row.gender) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="roomNo" label="房间号" width="100" />
|
||||
<el-table-column prop="careLevel" label="护理等级" />
|
||||
</el-table>
|
||||
@@ -22,8 +26,16 @@ export default {
|
||||
const res = await familyElders();
|
||||
this.elders = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
genderLabel(value) {
|
||||
if (value === "M") return "男";
|
||||
if (value === "F") return "女";
|
||||
return value || "-";
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -17,41 +17,104 @@
|
||||
<el-form-item label="内容">
|
||||
<el-input v-model="form.content" type="textarea" />
|
||||
</el-form-item>
|
||||
<el-form-item label="评分">
|
||||
<el-input v-model="form.rating" />
|
||||
<el-form-item label="评分" class="rate-item">
|
||||
<el-rate v-model="form.rating" />
|
||||
</el-form-item>
|
||||
<el-button type="primary" @click="submit">提交</el-button>
|
||||
</el-form>
|
||||
<div style="margin-top: 18px;">
|
||||
<h4 style="margin: 0 0 8px;">我的反馈</h4>
|
||||
<el-table :data="items" stripe>
|
||||
<el-table-column prop="createdAt" label="时间" width="180" />
|
||||
<el-table-column label="类型" width="120">
|
||||
<template slot-scope="scope">
|
||||
<el-tag :type="typeTag(scope.row.type)">{{ typeLabel(scope.row.type) }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="content" label="内容" />
|
||||
<el-table-column label="状态" width="120">
|
||||
<template slot-scope="scope">
|
||||
<el-tag :type="statusTag(scope.row.status)">{{ statusLabel(scope.row.status) }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="reply" label="回复" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { familyElders, familyFeedback } from "../../api";
|
||||
import { familyElders, familyFeedback, familyFeedbackList } from "../../api";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
elders: [],
|
||||
form: { elderId: "", type: "SUGGESTION", content: "", rating: "" }
|
||||
form: { elderId: "", type: "SUGGESTION", content: "", rating: 0 },
|
||||
items: []
|
||||
};
|
||||
},
|
||||
async created() {
|
||||
try {
|
||||
const res = await familyElders();
|
||||
this.elders = res.data.data;
|
||||
this.loadList();
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
typeLabel(type) {
|
||||
if (type === "SUGGESTION") return "建议";
|
||||
if (type === "COMPLAINT") return "投诉";
|
||||
if (type === "PRAISE") return "表扬";
|
||||
return type || "-";
|
||||
},
|
||||
typeTag(type) {
|
||||
if (type === "SUGGESTION") return "info";
|
||||
if (type === "COMPLAINT") return "danger";
|
||||
if (type === "PRAISE") return "success";
|
||||
return "info";
|
||||
},
|
||||
statusLabel(status) {
|
||||
if (status === "NEW") return "新建";
|
||||
if (status === "PROCESSING") return "处理中";
|
||||
if (status === "CLOSED") return "已关闭";
|
||||
return status || "-";
|
||||
},
|
||||
statusTag(status) {
|
||||
if (status === "NEW") return "warning";
|
||||
if (status === "PROCESSING") return "";
|
||||
if (status === "CLOSED") return "success";
|
||||
return "info";
|
||||
},
|
||||
async loadList() {
|
||||
try {
|
||||
const res = await familyFeedbackList();
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
},
|
||||
async submit() {
|
||||
try {
|
||||
await familyFeedback(this.form);
|
||||
this.$message.success("submitted");
|
||||
this.$message.success("提交成功");
|
||||
this.form.content = "";
|
||||
this.form.rating = 0;
|
||||
this.loadList();
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "submit failed");
|
||||
this.$message.error(e.message || "提交失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.rate-item ::v-deep .el-form-item__content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ export default {
|
||||
const res = await familyElders();
|
||||
this.elders = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@@ -38,9 +38,10 @@ export default {
|
||||
const res = await familyHealthList(this.elderId);
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -21,8 +21,9 @@ export default {
|
||||
const res = await familyNoticeList();
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -46,16 +46,16 @@ export default {
|
||||
const res = await uploadFile(option.file);
|
||||
this.form.attachmentUrl = res.data.data.url;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "upload failed");
|
||||
this.$message.error(e.message || "上传失败");
|
||||
}
|
||||
},
|
||||
async create() {
|
||||
try {
|
||||
const payload = { ...this.form, recordTime: formatDateTime(this.form.recordTime) };
|
||||
await nurseCareCreate(payload);
|
||||
this.$message.success("saved");
|
||||
this.$message.success("保存成功");
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "save failed");
|
||||
this.$message.error(e.message || "保存失败");
|
||||
}
|
||||
},
|
||||
async load() {
|
||||
@@ -64,9 +64,11 @@ export default {
|
||||
const res = await nurseCareList(this.filterElderId);
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
@@ -34,19 +34,21 @@ export default {
|
||||
const res = await nurseHandoverList();
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
},
|
||||
async create() {
|
||||
try {
|
||||
const payload = { ...this.form, date: formatDate(this.form.date) };
|
||||
await nurseHandoverCreate(payload);
|
||||
this.$message.success("saved");
|
||||
this.$message.success("保存成功");
|
||||
this.load();
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "save failed");
|
||||
this.$message.error(e.message || "保存失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
@@ -48,9 +48,9 @@ export default {
|
||||
try {
|
||||
const payload = { ...this.form, recordTime: formatDateTime(this.form.recordTime) };
|
||||
await nurseHealthCreate(payload);
|
||||
this.$message.success("saved");
|
||||
this.$message.success("保存成功");
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "save failed");
|
||||
this.$message.error(e.message || "保存失败");
|
||||
}
|
||||
},
|
||||
async load() {
|
||||
@@ -59,9 +59,11 @@ export default {
|
||||
const res = await nurseHealthList(this.filterElderId);
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
@@ -21,8 +21,9 @@ export default {
|
||||
const res = await nurseNoticeList();
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
this.$message.error(e.message || "加载失败");
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user