2024.11.22

package com.example.xxxmes.entity;

import java.util.Date;

public class ProductionTask {
private int taskId; // 任务ID
private int productId; // 产品ID
private String batchNo; // 批号
private String status; // 状态
private Date startTime; // 开始时间
private Date endTime; // 结束时间
private String productName; // 产品名称
private String specifications; // 规格
private String material; // 材料
private double unitWeight; // 单位重量

public ProductionTask() {
}

public ProductionTask(int taskId, int productId, String batchNo, String status, Date startTime, Date endTime) {
this.taskId = taskId;
this.productId = productId;
this.batchNo = batchNo;
this.status = status;
this.startTime = startTime;
this.endTime = endTime;
}

public int getTaskId() {
return taskId;
}

public void setTaskId(int taskId) {
this.taskId = taskId;
}

public int getProductId() {
return productId;
}

public void setProductId(int productId) {
this.productId = productId;
}

public String getBatchNo() {
return batchNo;
}

public void setBatchNo(String batchNo) {
this.batchNo = batchNo;
}

public String getStatus() {
return status;
}

public void setStatus(String status) {
this.status = status;
}

public Date getStartTime() {
return startTime;
}

public void setStartTime(Date startTime) {
this.startTime = startTime;
}

public Date getEndTime() {
return endTime;
}

public void setEndTime(Date endTime) {
this.endTime = endTime;
}

public String getProductName() {
return productName;
}

public void setProductName(String productName) {
this.productName = productName;
}

public String getSpecifications() {
return specifications;
}
package com.example.xxxmes.entity;

public class Report {
private int reportID; // ReportID
private int productID; // ProductID
private int processID; // ProcessID
private int taskID; // TaskID
private String workerName; // 报工人员
private String stationName; // 工位名称
private String productName; // 产品名称
private String specifications; // 规格
private String material; // 材料
private double unitWeight; // 单位重量
private int inputQuantity; // InputQuantity
private int outputQuantity; // OutputQuantity
private int scrapQuantity; // ScrapQuantity
private String remarks; // 备注

// 默认构造函数
public Report() {
}

// 带参数的构造函数
public Report(int reportID, int productID, int processID, int taskID, String workerName, String stationName,
String productName, String specifications, String material, double unitWeight,
int inputQuantity, int outputQuantity, int scrapQuantity, String remarks) {
this.reportID = reportID;
this.productID = productID;
this.processID = processID;
this.taskID = taskID;
this.workerName = workerName;
this.stationName = stationName;
this.productName = productName;
this.specifications = specifications;
this.material = material;
this.unitWeight = unitWeight;
this.inputQuantity = inputQuantity;
this.outputQuantity = outputQuantity;
this.scrapQuantity = scrapQuantity;
this.remarks = remarks;
}

// Getter 和 Setter 方法
public int getReportID() {
return reportID;
}

public void setReportID(int reportID) {
this.reportID = reportID;
}

public int getProductID() {
return productID;
}

public void setProductID(int productID) {
this.productID = productID;
}

public int getProcessID() {
return processID;
}

public void setProcessID(int processID) {
this.processID = processID;
}

public int getTaskID() {
return taskID;
}

public void setTaskID(int taskID) {
this.taskID = taskID;
}

public String getWorkerName() {
return workerName;
}

public void setWorkerName(String workerName) {
this.workerName = workerName;
}

public String getStationName() {
return stationName;
}

public void setStationName(String stationName) {
this.stationName = stationName;
}

public String getProductName() {
return productName;
}

public void setProductName(String productName) {
this.productName = productName;
}

public String getSpecifications() {
return specifications;
}

public void setSpecifications(String specifications) {
this.specifications = specifications;
}

public String getMaterial() {
return material;
}

public void setMaterial(String material) {
this.material = material;
}

public double getUnitWeight() {
return unitWeight;
}

public void setUnitWeight(double unitWeight) {
this.unitWeight = unitWeight;
}

public int getInputQuantity() {
return inputQuantity;
}

public void setInputQuantity(int inputQuantity) {
this.inputQuantity = inputQuantity;
}

public int getOutputQuantity() {
return outputQuantity;
}

public void setOutputQuantity(int outputQuantity) {
this.outputQuantity = outputQuantity;
}

public int getScrapQuantity() {
return scrapQuantity;
}

public void setScrapQuantity(int scrapQuantity) {
this.scrapQuantity = scrapQuantity;
}

public String getRemarks() {
return remarks;
}
package com.example.xxxmes;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;

import androidx.activity.result.ActivityResultLauncher;
import androidx.appcompat.app.AppCompatActivity;

import com.example.xxxmes.utils.JDBCUtils;
import com.journeyapps.barcodescanner.ScanContract;
import com.journeyapps.barcodescanner.ScanOptions;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;

public class ReportActivity extends AppCompatActivity {

private EditText processIdInput;
private EditText workerNameInput;
private EditText stationNameInput;
private EditText taskNumberInput;
private EditText productIdInput;
private EditText productNameInput;
private EditText specificationsInput;
private EditText materialInput;
private EditText unitWeightInput;
private EditText inputQuantityInput;
private EditText outputQuantityInput;
private EditText scrapQuantityInput;

private int receivedEmployeeId;
private int receivedTaskId;

private Connection connection;
public static final String TAG = "ReportActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_report);

receivedEmployeeId = getIntent().getIntExtra("EMPLOYEE_ID", -1);
receivedTaskId = getIntent().getIntExtra("TASK_ID", -1);

initializeViews();

if (receivedEmployeeId!= -1) {
fetchEmployeeData();
}

Button submitButton = findViewById(R.id.submitButton);
submitButton.setOnClickListener(v -> submitReport());

ImageButton scanButton = findViewById(R.id.scanButton);
scanButton.setOnClickListener(v -> startScan());

if (receivedTaskId!= -1) {
taskNumberInput.setText(String.valueOf(receivedTaskId));
}
}

private void initializeViews() {
processIdInput = findViewById(R.id.processIdInput);
workerNameInput = findViewById(R.id.workerNameInput);
stationNameInput = findViewById(R.id.stationNameInput);
taskNumberInput = findViewById(R.id.taskNumberInput);
productIdInput = findViewById(R.id.productIDInput);
productNameInput = findViewById(R.id.productNameInput);
specificationsInput = findViewById(R.id.specificationsInput);
materialInput = findViewById(R.id.materialInput);
unitWeightInput = findViewById(R.id.unitWeightInput);
inputQuantityInput = findViewById(R.id.inputQuantityInput);
outputQuantityInput = findViewById(R.id.outputQuantityInput);
scrapQuantityInput = findViewById(R.id.scrapQuantityInput);
}

private final ActivityResultLauncher<ScanOptions> barcodeLauncher = registerForActivityResult(
new ScanContract(),
result -> {
if (result.getContents()!= null) {
String[] scannedData = result.getContents().split(",");
if (scannedData.length >= 5) {
productIdInput.setText(scannedData[0].trim());
productNameInput.setText(scannedData[1].trim());
specificationsInput.setText(scannedData[2].trim());
materialInput.setText(scannedData[3].trim());
unitWeightInput.setText(scannedData[4].trim());
} else {
Log.e(TAG, "扫描的数据格式不正确");
}
}
});

private void startScan() {
ScanOptions options = new ScanOptions();
options.setPrompt("请扫描二维码");
options.setBeepEnabled(true);
options.setBarcodeImageEnabled(true);
options.setOrientationLocked(true);
options.setCaptureActivity(PortraitCaptureActivity.class);
barcodeLauncher.launch(options);
}

private void fetchEmployeeData() {
new Thread(() -> {
try {
connection = JDBCUtils.getConn();
String sql = "SELECT ProcessID, Name, Position FROM Employee WHERE EmployeeID =?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setInt(1, receivedEmployeeId);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
final String processId = rs.getString("ProcessID");
final String employeeName = rs.getString("Name");
final String position = rs.getString("Position");

runOnUiThread(() -> {
processIdInput.setText(processId);
workerNameInput.setText(employeeName);
stationNameInput.setText(position);
});
}
}
} catch (SQLException e) {
Log.e(TAG, "查询员工信息失败", e);
}
} finally {
closeConnection();
}
}).start();
}

private void submitReport() {
String processId1 = processIdInput.getText().toString().trim();
String taskNumber = taskNumberInput.getText().toString().trim();
String productId = productIdInput.getText().toString().trim();
int outputQuantity;

// 输出获取的 productId 以供调试
Log.d(TAG, "获取的 productId: " + productId);

try {
outputQuantity = Integer.parseInt(outputQuantityInput.getText().toString().trim());
} catch (NumberFormatException e) {
Log.e(TAG, "数量输入不正确", e);
return;
}

new Thread(() -> {
try {
connection = JDBCUtils.getConn();
connection.setAutoCommit(false);

int productionTaskProductId = getProductionTaskProductId(taskNumber);
// 将获取的 productId 转换为 int 类型
int productIdInt = Integer.parseInt(productId);
int processId2 = getNextProcessId(processId1, productionTaskProductId);

Log.d(TAG, "processId1: " + processId1 + ", productionTaskProductId: " + productionTaskProductId);
Log.d(TAG, "processId2: " + processId2);

if (processId2 == 0) {
Log.e(TAG, "未找到有效的下一个工序");
return;
}

// 插入到 report 表
insertReportData(productIdInt, processId1, outputQuantity);

insertProcessHandoverData(processId1, processId2, productIdInt, outputQuantity, receivedEmployeeId);
updateProductionTask(taskNumber, outputQuantity);


connection.commit();
Log.d(TAG, "报告数据成功插入到 Report 表中,任务状态更新为 Completed");
} catch (SQLException e) {
Log.e(TAG, "数据插入失败", e);
rollbackTransaction();
} finally {
closeConnection();
}
}).start();
}

private void insertReportData(int productId, String processId, int outputQuantity) throws SQLException {
String sql = "INSERT INTO reportwork (ProductID, ProcessID, WorkerName, StationName, TaskID, ProductName, Specifications, Material, UnitWeight, InputQuantity, OutputQuantity, ScrapQuantity) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";

try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setInt(1, productId);
ps.setString(2, processId);
ps.setString(3, workerNameInput.getText().toString().trim());
ps.setString(4, stationNameInput.getText().toString().trim());
ps.setString(5, taskNumberInput.getText().toString().trim());
ps.setString(6, productNameInput.getText().toString().trim());
ps.setString(7, specificationsInput.getText().toString().trim());
ps.setString(8, materialInput.getText().toString().trim());

// 处理 UnitWeight 输入
String unitWeightText = unitWeightInput.getText().toString().trim();
ps.setBigDecimal(9, unitWeightText.isEmpty() ? null : new BigDecimal(unitWeightText));

ps.setInt(10, Integer.parseInt(inputQuantityInput.getText().toString().trim()));
ps.setInt(11, outputQuantity);
ps.setInt(12, Integer.parseInt(scrapQuantityInput.getText().toString().trim()));

ps.executeUpdate();
}
}


private void insertProcessHandoverData(String processId1, int processId2, int productId, int outputQuantity, int operatorId) throws SQLException {
String sql = "INSERT INTO ProcessHandOver (SourceProcessID, TargetProcessID, ProductID, HandOverDate, Quantity, Status, OperatorID) VALUES (?,?,?,?,?,?,?)";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, processId1);
ps.setInt(2, processId2);
ps.setInt(3, productId);
ps.setTimestamp(4, new Timestamp(new Date().getTime()));
ps.setInt(5, outputQuantity);
ps.setString(6, "Completed");
ps.setInt(7, operatorId);
ps.executeUpdate();
}
}

private int getProductionTaskProductId(String taskNumber) throws SQLException {
String sql = "SELECT ProductID FROM ProductionTask WHERE TaskID = ?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, taskNumber);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
return rs.getInt("ProductID");
}
}
}
return -1;
}

private int getNextProcessId(String processId1, int productionTaskProductId) throws SQLException {
String sql = "SELECT ProcessID FROM Process WHERE ProductID =? AND ProcessID >? ORDER BY ProcessID ASC LIMIT 1";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setInt(1, productionTaskProductId);
ps.setString(2, processId1);
Log.d(TAG, "SQL: " + sql + ", ProductID: " + productionTaskProductId + ", ProcessID: " + processId1);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
return rs.getInt("ProcessID"); // 注意这里应为 ProcessID
}
}
}
return 0;
}


private void updateProductionTask(String taskNumber, int outputQuantity) throws SQLException {
// 先获取当前时间戳
Timestamp currentTimeStamp = new Timestamp(new Date().getTime());

// 更新当前任务的EndTime和Status
String sqlUpdateTask = "UPDATE ProductionTask SET EndTime =?, Status = 'Completed' WHERE TaskID =?";
try (PreparedStatement psUpdateTask = connection.prepareStatement(sqlUpdateTask)) {
psUpdateTask.setTimestamp(1, currentTimeStamp);
psUpdateTask.setString(2, taskNumber);
psUpdateTask.executeUpdate();
}

// 获取上一条相同productId的BatchNo
String batchNo = getPreviousBatchNo(productIdInput.getText().toString().trim());

// 在ProductionTask表中新增一条数据
String sqlInsertNewTask = "INSERT INTO ProductionTask (ProductID, BatchNo, Status, StartTime, EndTime, ProcessID) VALUES (?,?,?,?,?,?)";
try (PreparedStatement psInsertNewTask = connection.prepareStatement(sqlInsertNewTask)) {
psInsertNewTask.setInt(1, Integer.parseInt(productIdInput.getText().toString().trim()));
psInsertNewTask.setString(2, batchNo);
psInsertNewTask.setString(3, "In Progress");
psInsertNewTask.setTimestamp(4, currentTimeStamp); // 开始时间
psInsertNewTask.setTimestamp(5, null); // 将结束时间设置为 null
psInsertNewTask.setInt(6, getNextProcessId(processIdInput.getText().toString().trim(), Integer.parseInt(productIdInput.getText().toString().trim())));
psInsertNewTask.executeUpdate();
}

}

private String getPreviousBatchNo(String productId) throws SQLException {
String sql = "SELECT BatchNo FROM ProductionTask WHERE ProductID =? ORDER BY TaskID DESC LIMIT 1";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, productId);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
return rs.getString("BatchNo");
}
}
}
return "";
}


private void rollbackTransaction() {
try {
if (connection!= null) {
connection.rollback();
Log.d(TAG, "回滚事务");
}
} catch (SQLException e) {
Log.e(TAG, "事务回滚失败", e);
}
}

private void closeConnection() {
if (connection!= null) {
try {
connection.close();
} catch (SQLException e) {
Log.e(TAG, "关闭数据库连接失败", e);
}
}
}
}

public void setRemarks(String remarks) {
this.remarks = remarks;
}
}


public void setSpecifications(String specifications) {
this.specifications = specifications;
}

public String getMaterial() {
return material;
}

public void setMaterial(String material) {
this.material = material;
}

public double getUnitWeight() {
return unitWeight;
}

public void setUnitWeight(double unitWeight) {
this.unitWeight = unitWeight;
}
package com.example.xxxmes;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import com.example.xxxmes.utils.JDBCUtils;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class WorkFragment extends Fragment {

private LinearLayout tasksContainer;
private LinearLayout equipmentContainer;
private int employeeId;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.work_fragment, container, false);

tasksContainer = view.findViewById(R.id.tasksContainer);
equipmentContainer = view.findViewById(R.id.equipmentContainer);
Button scanQRCodeButton = view.findViewById(R.id.scanQRCodeButton);

SharedPreferences sharedPreferences = getActivity().getSharedPreferences("user_prefs", getContext().MODE_PRIVATE);
employeeId = sharedPreferences.getInt("employee_id", -1);

loadTodayTasks();
loadIdleEquipment();

scanQRCodeButton.setOnClickListener(v -> startQRCodeScanner());

return view;
}

// 加载当天任务
// 加载当天任务
private void loadTodayTasks() {
new Thread(() -> {
String sql = "SELECT pt.* FROM productiontask pt " +
"JOIN employee e ON pt.ProcessID = e.ProcessID " +
"WHERE e.EmployeeID = ? AND pt.Status = 'In Progress' " +
"AND DATE(pt.StartTime) = CURDATE()";
try (Connection connection = JDBCUtils.getConn();
PreparedStatement ps = connection.prepareStatement(sql)) {

ps.setInt(1, employeeId); // 将员工ID作为参数传入
try (ResultSet rs = ps.executeQuery()) {
List<Task> taskList = new ArrayList<>();
while (rs.next()) {
int taskId = rs.getInt("TaskID");
String batchNo = rs.getString("BatchNo");
taskList.add(new Task(taskId, batchNo));
}

getActivity().runOnUiThread(() -> {
tasksContainer.removeAllViews();
for (Task task : taskList) {
LinearLayout taskLayout = new LinearLayout(getContext());
taskLayout.setOrientation(LinearLayout.VERTICAL);

// 添加任务按钮
Button taskButton = new Button(getContext());
taskButton.setText("任务ID: " + task.getTaskId() + ", 批次号: " + task.getBatchNo());
taskButton.setOnClickListener(v -> openReportActivity(task.getTaskId()));
taskLayout.addView(taskButton);

// 添加绿色的“领料”按钮
Button receiveMaterialButton = new Button(getContext());
receiveMaterialButton.setText("领料");
receiveMaterialButton.setBackgroundTintList(ContextCompat.getColorStateList(getContext(), android.R.color.holo_green_light));
receiveMaterialButton.setOnClickListener(v -> openReceiveMaterialActivity(task.getTaskId()));
taskLayout.addView(receiveMaterialButton);

tasksContainer.addView(taskLayout);
}
});
}
} catch (SQLException e) {
Log.e("WorkFragment", "加载任务时出错: " + e.getMessage());
e.printStackTrace();
}
}).start();
}


// 加载空闲设备
private void loadIdleEquipment() {
new Thread(() -> {
String sql = "SELECT e.EquipmentID, e.Name FROM Equipment e " +
"JOIN Process p ON p.EquipmentID = e.EquipmentID " +
"JOIN Employee em ON em.ProcessID = p.ProcessID " +
"WHERE em.EmployeeID = ? AND CONVERT(e.Status USING latin1) = 'Idle'";

try (Connection connection = JDBCUtils.getConn();
PreparedStatement ps = connection.prepareStatement(sql)) {

ps.setInt(1, employeeId);

try (ResultSet rs = ps.executeQuery()) {
List<String> equipmentList = new ArrayList<>();
while (rs.next()) {
int equipmentId = rs.getInt("EquipmentID");
String equipmentName = rs.getString("Name");
equipmentList.add("设备ID: " + equipmentId + ", 名称: " + equipmentName);
}

getActivity().runOnUiThread(() -> {
equipmentContainer.removeAllViews();
if (!equipmentList.isEmpty()) {
for (String equipmentInfo : equipmentList) {
TextView equipmentText = new TextView(getContext());
equipmentText.setText(equipmentInfo);
equipmentContainer.addView(equipmentText);
}
} else {
TextView noEquipmentText = new TextView(getContext());
noEquipmentText.setText("没有空闲设备");
equipmentContainer.addView(noEquipmentText);
}
});
}
} catch (SQLException e) {
Log.e("WorkFragment", "加载空闲设备时出错: " + e.getMessage());
e.printStackTrace();
}
}).start();
}

// 启动二维码扫描
private void startQRCodeScanner() {
IntentIntegrator integrator = IntentIntegrator.forSupportFragment(this);
integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE);
integrator.setPrompt("扫描设备二维码");
integrator.setCameraId(0);
integrator.setBeepEnabled(true);
integrator.setBarcodeImageEnabled(true);
integrator.initiateScan();
}

@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);

IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (result != null && result.getContents() != null) {
String equipmentId = result.getContents();
recordEquipmentTime(equipmentId);
}
}

// 记录设备的开始或结束时间
private void recordEquipmentTime(String equipmentId) {
new Thread(() -> {
try (Connection connection = JDBCUtils.getConn()) {
String checkSql = "SELECT StartTime, EndTime FROM equipment WHERE EquipmentID = ?";
try (PreparedStatement checkStmt = connection.prepareStatement(checkSql)) {
checkStmt.setString(1, equipmentId);
ResultSet rs = checkStmt.executeQuery();
if (rs.next()) {
String updateSql;
String newStatus;
if (rs.getTimestamp("StartTime") == null) {
updateSql = "UPDATE equipment SET StartTime = ?, Status = ? WHERE EquipmentID = ?";
newStatus = "Working";
} else {
updateSql = "UPDATE equipment SET EndTime = ?, Status = ? WHERE EquipmentID = ?";
newStatus = "Idle";
}
try (PreparedStatement updateStmt = connection.prepareStatement(updateSql)) {
updateStmt.setTimestamp(1, new java.sql.Timestamp(System.currentTimeMillis()));
updateStmt.setString(2, newStatus);
updateStmt.setString(3, equipmentId);
updateStmt.executeUpdate();
}
}
}
} catch (SQLException e) {
Log.e("WorkFragment", "更新设备时间失败: " + e.getMessage());
e.printStackTrace();
}
}).start();
}

private void openReportActivity(int taskId) {
Intent intent = new Intent(getActivity(), ReportActivity.class);
intent.putExtra("TASK_ID", taskId);
intent.putExtra("EMPLOYEE_ID", employeeId); // 传递员工ID
startActivity(intent);
}

private void openReceiveMaterialActivity(int taskId) {
Intent intent = new Intent(getActivity(), MaterialActivity.class);
intent.putExtra("TASK_ID", taskId);
intent.putExtra("EMPLOYEE_ID", employeeId); // 传递员工ID
startActivity(intent);
}

private static class Task {
private final int taskId;
private final String batchNo;

public Task(int taskId, String batchNo) {
this.taskId = taskId;
this.batchNo = batchNo;
}

public int getTaskId() {
return taskId;
}

public String getBatchNo() {
return batchNo;
}
}
}

}
posted @   我也不想的  阅读(5)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示